BASHは1つを除くすべてのファイルをコピーします


109

Default.pngという名前のファイルを除いて、dirからすべてのファイルをコピーしたいと思います。これを行うにはいくつかの方法があるようです。あなたにとって最も効果的なものは何ですか?


コピーした後に削除するのではなく、なぜそのファイルをスキップする必要があるのですか?ターゲットディレクトリに既に存在しますか?
Lasse V. Karlsen、

1
はい、同じ名前のファイルがすでにターゲットディレクトリに存在しています。
ジョーカンナッティ2009

@ LasseV.Karlsen:または、ファイルが大きい場合は、コピーする時間を節約できます。私はこれに興味がありますが、ファイルではなくディレクトリを除外します。
Nikana Reklawyks、2012年

回答:


54

単純、src/ファイルのみが含まれる場合:

find src/ ! -name Default.png -exec cp -t dest/ {} +

src/サブディレクトリがある場合、これはそれらを省略しますが、その中のファイルをコピーします:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} +

src/にサブディレクトリがある場合、これはそれらに再帰しません:

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +

5
OS Xはグロブを有効にせずに出荷されているように見えるので、これは私にとって最良であることがわかりました。
ジョー・カンナッティ2009

6
@Max \;は、コマンドをファイルごとに1回実行します。+コマンドを1回実行し、すべてのファイル名を一度に渡します(コマンドラインの長さの制限に従います)。+一般的に少し効率的です。
John Kugelman、2014

148

次のようになります。

cp -r !(Default.png) /dest

現在のフォルダーにネストされたフォルダーにコピーする場合(以下のケースでは例と呼ばれます)、そのディレクトリーも省略する必要があります。

cp -r !(Default.png|example) /example

16
これにより、-bash:!:イベントが見つかりません
Joe Cannatti、2009

コピー元のフォルダー内にネストされているフォルダーにファイルをコピーしていますか?
Jon

46
shopt -s extglob無効になっている場合、これは機能する必要があります。
バリーケリー

5
shopt -s extglobOSXは@BarryKellyの説明に従って使用する必要があるようです。これで完璧に動作します。
Kat 14

何年もバッシュで知らなかった!()...美しい!私のように、bashを勉強/レビューする時がきたと感じている人のために、この質問/回答に関連する関連リンクを次に示します:shopt / extglobパターン
Brandt

73

rsyncは長い間、私のcp / scpの代替品です。

rsync -av from/ to/ --exclude=Default.png

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity

2つの異なるファイルを除外する場合、どのように使用すればよいですか?
Pulkit Bansal 2018

複数の--exclude =引数がサポートされています。また、-rディレクトリを同期している場合は、引数を忘れないでください
Rian Sanderson

5

私はただやる:

cp srcdir/* destdir/ ; rm destdir/Default.png

ファイルが大きくない限り。そうでなければ、例えば

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/

1
最初のコマンドは、OPが要求したものではありません。Default.png2つのディレクトリに存在する場合は、の1つがの1つに置き換えdestdirられsrcdir、コピーされDefault.pngたが削除されます。代わりに、OPはにDefault.png既に存在するものを保持したいと考えていますdestdir
SnowFrog、2017年

2
default.pngはすでにdestdirに存在しますか?あなたの解決策は機能しません。
イマンモハマディ

2

これは、ノードモジュール以外のすべてをコピーするのに最適です。あなたがそれを求めずにプログレスバーを見ることができるので、CPよりRsyncが私の意見ではより良いです。

   rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules



-2

正規表現でシェルの展開パラメーターを使用する

cp /<path>/[^not_to_copy_file]* .

not_to_copy_fileを除くすべてがコピーされます

-これに問題がある場合。ご指定ください !


1
SOへようこそ。残念ながら、あなたの答えは正しくありません。大括弧表現([...])には、一致する文字のセットが含まれていますが、先行^文字は、リストされた文字の補集合の一致を引き起こします。次の例では、どちらのファイルもリストされません。touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*次の文字のいずれかで始まるすべてのファイル名が除外されるためです_cefilnopty
rtx13
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.