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


111

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

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

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

  • ディレクトリ構造もコピーし、ファイルだけが必要です(したがって、すべてのファイルは最終的に/ target_directory /にあるはずです)

  • ファイル名にスペースが含まれているファイルはコピーされません(かなりの数です)。

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


どうfind... exec mvですか?
fedorqui 'SO stop harming' 2013

回答:


173

--parents ディレクトリ構造をコピーしているので、それを取り除く必要があります。

これを記述した方法、find実行、および出力はcp、ファイル名を区切るスペースとファイル名のスペースを区別できないようにコマンドラインに配置されます。次のようなことをする方が良いです

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

cpfind見つかったファイル名ごとに実行され、ファイル名を正しく渡しました。このテクニックの詳細は次のとおりです。

上記のすべての代わりに、zshを使用して単純に次のように入力できます。

$ cp **/*.xls target_directory

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


2
はい。「ビンイット」はそれを捨てることを意味します。現在修正中:-)
Brian Agnew

13
Bash4.0+およびksh93もサポートします**。bashの場合は、を使用shopt -s globstarして有効にします。kshの場合は、set -Gまたはset -o globstarです。
pynexj 2013年

2
@ダリル-私はさらに記入しました。しかし、答えはすでに「承認済み」とマークされていました、メモ
ブライアンアグニュー

5
それExecは、すべての可能な限り少ないCP呼び出しなどでそれを行うであろう、技術的にxargsのに渡すよりも効率が低い: find . -name '*.xls' -print0 | xargs -0 cp -t destdir
Taywee

2
@BrianAgnewああ、きっと、わがままなグーグルのコメントに追加の情報があればいいのだ。
タイウィー

37

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

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

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

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

  • p-ファイルの属性を保持する
  • r-再帰的
  • v-詳細(何がコピーされているかを示します)

1
これは、SSHでBluehostにアクセスしたときに私がしなければならなかったことと同じです。
プラマー

4
サブディレクトリは保持されません。
b005t3r

3
@ b005t3rは仕様によるものであり、想定されていません。それがOPの質問の意図全体でした。彼はサブディレクトリからすべてのファイルをサブディレクトリなしで1つのディレクトリにコピーしたかった
Madivad

2
これを変更してサブディレクトリを保持する方法はありますか?
マシューディーン

8

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

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

'{}'そして";"、各ファイルにコピーを実行します。


3

私自身もこれを行わなければなりませんでした。私はそれをcpの--parents引数を介して行いました:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;

1
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

--parentsを削除することはできますが、複数のファイルに同じ名前が付いている場合は衝突のリスクがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.