UNIXでは、特定の拡張子を持つすべてのファイル(すべてのExcelファイル)をすべてのサブディレクトリから別のディレクトリにコピーします。次のコマンドがあります:
cp --parents `find -name \*.xls*` /target_directory/
このコマンドの問題は次のとおりです。
また、ディレクトリ構造もコピーし、ファイルのみが必要です(したがって、すべてのファイルは/ target_directory /に配置されます)
ファイル名にスペースを含むファイルはコピーしません(かなりの数です)
これらの問題の解決策はありますか?
--parents
はディレクトリ構造をコピーしているため、削除する必要があります。
これを記述した方法では、find
が実行され、cp
がファイル名を区切るスペースとスペースwithinファイル名。次のようなことをする方が良い
$ find . -name \*.xls -exec cp {} newDir \;
ここで、cp
が検出した各ファイル名に対してfind
が実行され、ファイル名が正しく渡されます。 詳細はこちら このテクニックについて。
上記のすべての代わりに、 zsh を使用して、単に入力することができます
$ cp **/*.xls target_directory
zsh
は、ワイルドカードを展開してサブディレクトリを含めることができ、このようなことを非常に簡単にします。
上記のすべてから、私はこのバージョンを思いつきました。このバージョンは、Macリカバリターミナルでも機能します。
find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'
現在のディレクトリを検索し、xsl拡張子を持つファイルのすべてのサブディレクトリを再帰的に検索します。それらをすべてターゲットディレクトリにコピーします。
cpフラグは次のとおりです。
同様の問題がありました。私はそれを使って解決しました:
find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"
'{}'
および";"
は、各ファイルでコピーを実行します。
私も自分でこれをしなければなりませんでした。 cpの--parents引数を使用して実行しました。
find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;
find [SOURCEPATH] -type f -name '[PATTERN]' |
while read P; do cp --parents "$P" [DEST]; done
--parentsを削除してもかまいませんが、複数のファイルに同じ名前が付けられている場合、衝突のリスクがあります。