特定のファイル拡張子を持つファイルを抽出し、ディレクトリ構造を保存しますか?

特定のファイル拡張子を持つファイルを抽出し、ディレクトリ構造を保存しますか?

日付別に構成されたディレクトリには、多くの.CR2ファイルと.ARWファイルが混在しています(2016にはフォルダ06と07があり、その中に毎日フォルダがあります。たとえば、ファイルは2016/06/03にあります)。

構造を維持しながら、.ARWファイルを別のフォルダに抽出したいと思います。可能ですか?

つまり、同じ構造の2つの2016フォルダが必要ですが、そのうちの1つには.ARWファイルのみがあり、1つには.CR2ファイルのみが必要です。

答え1

これらのrsyncコマンドは要件を満たす必要があります。

これによりARWが実行されます。

rsync -arvz --progress --include='*.ARW' --include="*/" --exclude="*" ./source-dir-2016 ./target-ARW-2016

これはCR2を実行します

rsync -arvz --progress --include='*.CR2' --include="*/" --exclude="*" ./source-dir-2016 ./target-CR2-2016

使ったこの投稿情報のソースとして。

答え2

find exec私は以下を使用する代替案を提案したいと思います。cp --parents

find ./ -name *.ARW -exec cp --parents {} /home/user/target-ARW-dir/ \;
find ./ -name *.CR2 -exec cp --parents {} /home/user/target-CR2-dir/ \;

これに対する制限は、作業ディレクトリがコピーするファイル構造の上にある必要があることです。


それが何をするかについてのアイデア:

findファイルを探す

./検索するディレクトリ

-name *.ARW.ARW で終わるファイルのみ一覧表示

-exec返されたファイルのリストからコマンドを実行します。

cp --parentsディレクトリ構造のコピーとメンテナンス

{}ファイル別レポートに拡張すると、次のようにfindなります。xfor x in $files

/home/user/target-ARW-dir/ただサンプルディレクトリなので、実際に必要なディレクトリに変更する必要があります。

\;find -execforループのように動作するようにaを終了する正しい方法

答え3

cpdirからaに再帰的に移動して2016からmainから始める2016_ARWのはどうですか?rm *.CR2rm *.ARW

例えば

user:~$ ls 2016/06/03/
file_one.ARW file_two.CR2 file_three.CR2 file_four.ARW file_five.ARW
user:~$ cp -R 2016 2016_ARW
user:~$ rm 2016_ARW/06/03/*.CR2
user:~$ rm 2016/06/03/*.ARW
user:~$ ls 2016/06/03/
file_two.CR2 file_three.CR2
user:~$ ls 2016_ARW/06/03/
file_one.ARW file_four.ARW file_five.ARW

関連情報