多数のファイルを日付構造のディレクトリ順にコピーする

多数のファイルを日付構造のディレクトリ順にコピーする

約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より簡単で短い場合zmvzshよりスマートであるため、変数拡張を入れ子にすることができます(たとえば、${${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-pdtcpmv
$1--

$2/var/public/voicelogging/quality_monitoring/(*)/(*).WAV'

$3/home/username/logging/${${2%_*}##*_}/$1

-n試運転;実際にコマンドを実行するには削除してください。

おすすめ記事