シェルスクリプト:複数のフォルダの最初のファイルを1つのフォルダにコピー

シェルスクリプト:複数のフォルダの最初のファイルを1つのフォルダにコピー

ディレクトリ内には数百のサブディレクトリがあります。各サブディレクトリには何百ものjpg画像があります。フォルダ名が「ABC_DEF」の場合、そのフォルダ内のファイル名は「ABC_DEF-001.jpg」、「ABC_DEF-002.jpg」などになります。

たとえば、

---Main Directory
------Sub-Directory ABC_DEF
----------ABC_DEF-001.jpg
----------ABC_DEF-002.jpg
------Sub-Directory ABC_GHI
----------ABC_GHI-001.jpg
----------ABC_GHI-002.jpg

各サブディレクトリの最初のファイル(拡張子が-001.jpgのファイルなど)のみをDESTDIRというパブリックターゲットフォルダにコピーしたいと思います。

与えられたコードを変更しましたここ私のユースケースに合わせて。ただし、常にファイル名で最初のディレクトリを印刷するため、ファイルを目的の宛先にコピーすることはできません。コードは次のとおりです。

DIR=/var/www/html/beeinfo.org/resources/videos/
find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { s/\n/,/g; p }')
    printf '%s,%s\n' "$files";
done

このコードをどのように修正できますか?

答え1

findすべてのファイルが同じ深さのディレクトリにあるのはなぜですか?

cd -- "$DIR" &&
  cp -- */*-001.jpg /destination/path

答え2

findパターンで終わる最初のファイルを選択する必要があり、各サブディレクトリにファイルが1つしかない場合にのみ-001.jpgこれを簡単に実行できるため、コマンドは次のようになります。

find . -name "*-001.jpg" -execdir echo cp -v {} /path/to/dest/ \;

ノートecho期待した結果が出たら、テストを実行するために削除してください。

答え3

find -exec {} +以下を使用してファイルのリストを取得できますcp

find /path/to/main/dir -name "*-001.jpg" -exec cp -t /path/to/dest/dir/ {} +

まず、機能をテストするにcpはに置き換えますecho cp

答え4

各サブディレクトリの番号順に、最初の一般ファイルに対してzsh次のことができます。

cp -- *(/e['reply=($REPLY/*(Nn.[1]))']) /path/to/destination/

最も年齢の高い人の場合:

cp -- *(/e['reply=($REPLY/*(NOm.[1]))']) /path/to/destination/

関連情報