166

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

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

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

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

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

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

4

5 に答える 5

249

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

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

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

を見つけたcpファイル名ごとに実行され、ファイル名が正しく渡されます。この手法の詳細については、こちらをご覧ください。find

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

$ cp **/*.xls target_directory

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

于 2013-03-25T14:10:28.123 に答える
50

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

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

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

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

  • p-ファイルの属性を保持します
  • r-再帰的
  • v-冗長(コピーされているものを表示します)
于 2016-05-03T18:48:27.677 に答える
12

私も同様の問題を抱えていました。私はそれを使用して解決しました:

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

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

于 2015-01-18T22:47:48.433 に答える
6

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

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;
于 2017-12-03T22:56:17.213 に答える
2
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

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

于 2019-05-13T02:11:04.957 に答える