複数のサブディレクトリから親ディレクトリにファイルをコピー/移動および名前変更する

複数のサブディレクトリから親ディレクトリにファイルをコピー/移動および名前変更する

複数のディレクトリがあり、各ディレクトリには画像を含む「サンプル」ディレクトリが含まれています。私が望むのは、各ファイルのファイル名の末尾に(拡張子の前に)テキストサフィックスを追加してから、ディレクトリの内容をその親ディレクトリにコピーすることです。

デフォルトでは、/maindir/dir1/example/、/maindir/dir2/exampleなどのファイル名を変更し、その親ディレクトリ(dir1やdir2など)にコピー/移動したいと思います。すべての「examples」ディレクトリの内容は.jpg拡張子を持つイメージです。この問題を正しい方法で進めているかどうかはわかりませんが、次のようにしてコピー部分を実行する方法を理解できました。

find /path/to/folder/ -type d -name example  -execdir bash -c 'cp  "$1"/* .' cp {}   \;

コンテンツを親フォルダに正しくコピーしますが、findを使用すると、コピーされたファイルにサフィックスを追加する方法が少し混乱します。

答え1

find1つの方法はループを使用し、forfファイルパスに使用することです。パラメータ拡張ターゲット名()を生成できるように、拡張子(t=${f##*.})、基本名(b=${f##*/})、および拡張子のない基本名()を抽出します。${b%.*}n=${b%.*}-thumb.${t}

find /path/to/folder/ -type d -name example  -execdir sh -c 'for f in "${1}"/*;
do t=${f##*.}; b=${f##*/}; n=${b%.*}-thumb.${t}; cp -- "$f" "$n"; done' cp {} \;

実行する内容を印刷するには、常にecho前に1つを挿入できます。cp


別の方法zsh

autoload zmv
zmv -n '(**/)example/(*)(.*)' '${1}${2}-thumb${3}'

-n(テスト実行)-Cコピーファイルに置き換えます。

関連情報