web-dev-qa-db-ja.com

すべてのサブディレクトリから特定の拡張子を持つすべてのファイルをコピーします

UNIXでは、特定の拡張子を持つすべてのファイル(すべてのExcelファイル)をすべてのサブディレクトリから別のディレクトリにコピーします。次のコマンドがあります:

cp --parents `find -name \*.xls*` /target_directory/

このコマンドの問題は次のとおりです。

  • また、ディレクトリ構造もコピーし、ファイルのみが必要です(したがって、すべてのファイルは/ target_directory /に配置されます)

  • ファイル名にスペースを含むファイルはコピーしません(かなりの数です)

これらの問題の解決策はありますか?

86
Abdel

--parentsはディレクトリ構造をコピーしているため、削除する必要があります。

これを記述した方法では、findが実行され、cpがファイル名を区切るスペースとスペースwithinファイル名。次のようなことをする方が良い

$ find . -name \*.xls -exec cp {} newDir \;

ここで、cpが検出した各ファイル名に対してfindが実行され、ファイル名が正しく渡されます。 詳細はこちら このテクニックについて。

上記のすべての代わりに、 zsh を使用して、単に入力することができます

$ cp **/*.xls target_directory

zshは、ワイルドカードを展開してサブディレクトリを含めることができ、このようなことを非常に簡単にします。

139
Brian Agnew

上記のすべてから、私はこのバージョンを思いつきました。このバージョンは、Macリカバリターミナルでも機能します。

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'

現在のディレクトリを検索し、xsl拡張子を持つファイルのすべてのサブディレクトリを再帰的に検索します。それらをすべてターゲットディレクトリにコピーします。

cpフラグは次のとおりです。

  • p-ファイルの属性を保持
  • r-再帰的
  • v-詳細(コピーされているものを表示)
25
guya

同様の問題がありました。私はそれを使って解決しました:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"

'{}'および";"は、各ファイルでコピーを実行します。

8
stingMantis

私も自分でこれをしなければなりませんでした。 cpの--parents引数を使用して実行しました。

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;
3
That Guy
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

--parentsを削除してもかまいませんが、複数のファイルに同じ名前が付けられている場合、衝突のリスクがあります。

1
Camion