約40.0000個のファイルを日付構造フォルダにコピーする必要があります。
サンプルファイル:
/var/public/voicelogging/quality_monitoring/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV
コピーする必要がある多くのファイルの1つです。/home/username/logging/
ファイル名には、使用する必要がある2つの変数があります。
bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV
20151209
もちろん、日付
12434
はファイルを作成したユーザーのIDです。
私にとって必要なのは、ディレクトリからユーザーIDを取得できるスクリプト/ライナーです。
次に、ユーザーIDを使用してディレクトリを作成します/home/username/logging
。フォルダを作成したら、見つけることができる各日付のディレクトリを作成する必要があります。
各ファイルを正しいuserid/date
ディレクトリに入れます。
結果ディレクトリの例
/home/username/logging/12434/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV
日付ディレクトリを作成するために1行のコードを作成しましたが、ユーザーIDディレクトリは自分で作成する必要があります。
find /var/public/voicelogging/quality_monitoring/ -type f -name "*12434*" | sed -r 's/^.{65}//' | cut -c1-8 | xargs -I {} mkdir {} /home/username/logging/12434
正しいファイルを正しい場所にコピーするにはどうすればよいですか?
答え1
find
次の使用方法install
:
find /var/public/voicelogging/quality_monitoring -name \*.WAV -exec sh -c '
bn=${0##*/}; x=${bn%%-*}; dt=${x##*_}; y=${bn%_*}; id=${y##*_}
install -D "$0" "/home/username/logging/${id}/${dt}/${bn}"' {} \;
これは、パラメータ拡張を使用してファイル名から日付:${dt}
とユーザーID:を抽出し、${id}
次を使用します。install
最後の行を次に置き換えずに、各ファイルを適切なuserID/date
ディレクトリにコピーします(私は怠惰だからです)。install
dest=/home/username/logging/${id}/${dt}; mkdir -p "${dest}" && cp "$0" "${dest}"' {} \;
これらの「日付」ディレクトリを繰り返し、.WAV
各ディレクトリのファイルを繰り返したい場合:
for d in /var/public/voicelogging/quality_monitoring/*; do
dt=${d##*/}
for f in $d/*.WAV; do
bn=${f##*/}; y=${bn%_*}; id=${y##*_}
dest=/home/username/logging/${id}/${dt}
mkdir -p "${dest}" && cp "${f}" "${dest}"
done
done
zsh
より簡単で短い場合zmv
(zsh
よりスマートであるため、変数拡張を入れ子にすることができます(たとえば、${${file%_*}##*_}
ユーザーIDを抽出するのに十分です))。
dtcp () {
mkdir -p $3 && cp $1 $2 $3
}
autoload zmv
zmv -n -p dtcp '/var/public/voicelogging/quality_monitoring/(*)/(*).WAV' \
'/home/username/logging/${${2%_*}##*_}/$1'
sは、などの(*)
2番目の引数に使用できる逆参照を作成します。ここでは代わりに関数を実行します。この関数はディレクトリを作成し、新しく作成されたディレクトリにファイルをコピーします。パラメータ(上記の逆参照で間違えないでください)は次のとおりです。 :オプションの終わりを示します。 :コピーする必要があるファイルです。 :対象です。注は示しています。$1
$2
zmv
-p
dtcp
mv
$1
--
$2
/var/public/voicelogging/quality_monitoring/(*)/(*).WAV'
$3
/home/username/logging/${${2%_*}##*_}/$1
-n
試運転;実際にコマンドを実行するには削除してください。