ターゲットにコピーし、名前の競合のために元の名前の代わりにUUID名を指定したい再帰フォルダ構造のいくつかのファイルがあります。
一般的な状況では、次のようにします。
SOURCE_DIR="/some/*/dir/struct/*/img_files" &&\
DEST_DIR="/dest/folder/0" &&\
rm -rf $DEST_DIR &&\
mkdir -p $DEST_DIR &&\
find $SOURCE_DIR \( -name "*.jpg" \) -exec cp {} $DEST_DIR \;
しかし、名前の競合のためにそれを行うことはできません。したがって、コピーされる各ファイルにuuid名を割り当てたいと思います。このために、以下を試しました。
SOURCE_DIR="/some/*/dir/struct/*/img_files" &&\
DEST_DIR="/dest/folder/0" &&\
rm -rf $DEST_DIR &&\
mkdir -p $DEST_DIR &&\
find $SOURCE_DIR \( -name "*.jpg" \) -exec cp {} $DEST_DIR/"$(uuidgen).jpg" \;
ただし、フォルダ内の複数のファイルの代わりにコピーされたファイルのみが取得されます。
答え1
1つのファイルのみを取得する理由は、シェルがコマンドを解析するときに実行結果に展開され、そのfind
結果が渡されるためです。$(uuidgen)
uuidgen
静的文字列として到着するfind
。その他のマイナーな質問があります。
- 変数名に大文字を使用しないでください。これはグローバル環境変数のルールであり、変数名の競合はデバッグするのが難しい場合があります。
- あなたの
find
問題は不必要に複雑です。 - 常に変数を引用してください!
\
その後は不要で&&
十分です&&
が、変数宣言も必要ありません。以下は、いくつかの改良が適用された作業バージョンのスクリプトです。
#!/bin/bash
source_dir="/some/*/dir/struct/*/img_files"
dest_dir="/dest/folder/0"
source_dir="."
dest_dir="bar"
rm -rf "$dest_dir" &&
mkdir -p "$dest_dir" &&
find "$source_dir" -name "*.jpg" -exec sh -c 'name='$dest_dir'/$(uuidgen).jpg; cp "$1" "$name"' sh {} \;
トリックはsh
内部でスクリプトを呼び出すことですfind
。残りはこれで処理されます。これを渡す必要がありますsh
(または最初と2番目のパラメータのみを使用する他のランダムな文字列)。{}
最初のパラメータは$0
このコンテキストにあるため、インポートするには2番目のパラメータが必要です$1
。