web-dev-qa-db-ja.com

Unix / Linuxの特定のファイルの再帰コピー?

すべてをコピーする必要があります*.jarディレクトリおよびそのすべてのサブディレクトリからのファイル。 UNIX/Linuxターミナルでどのようにできますか?コマンドcp -r *.jar /destination_dirは機能しません。

59
Yury Pogrebnyak

rsyncは、マシン間だけでなくローカルファイルのコピーにも役立ちます。これはあなたが望むことをします:

rsync -avm --include='*.jar' -f 'hide,! */' . /destination_dir

からのディレクトリ構造全体。/destination_dirにコピーされますが、.jarファイルのみがコピーされます。 -aは、ファイルに対するすべての許可と時刻が変更されないようにします。 -mは空のディレクトリを省略します。 -vは詳細出力用です。

ドライランの場合は、-nを追加します。何を実行するかを示しますが、実際には何もコピーしません。

90
Sean

Jarファイルのみのディレクトリ構造が必要ない場合は、次を使用できます。

shopt -s globstar
cp **/*.jar destination_dir

ディレクトリ構造が必要な場合は、cp--parentsオプション。

34
uzsolt

Findに-execスイッチがあり、cpに-tオプションがある場合:

find . -name "*.jar" -exec cp -t /destination_dir {} +

並列呼び出しに「+」が提供されない場合は、「;」を使用できます。ただし、-tを省略できます。

find . -name "*.jar" -exec cp {} /destination_dir ";"
17
user unknown
tar -cf - `find . -name "*.jar" -print` | ( cd /destination_dir && tar xBf - )
4
Pavan Manjunath
cp --parents `find -name \*.jar` destination/

man cpから:

--parents
       use full source file name under DIRECTORY
4

宛先の下で同じディレクトリ階層を維持する場合は、次を使用できます。

(cd SOURCE && find . -type f -name \*.jar -exec tar cf - {} +) \
  | (cd DESTINATION && tar xf -)

この方法では、findの出力をバックティック内で拡張する代わりに、任意の数のファイルを処理できるという利点があります。

2
Idelic
find . -name \*.jar | xargs cp -t /destination_dir

Jarファイル名にスペースが含まれておらず、cpに「-t」オプションがあると仮定します。 cpが「-t」を実行できない場合

find . -name \*.jar | xargs -I FILE cp FILE /destination_dir
1
glenn jackman