すべてではなく一部のファイルをコピーする方法は?


54

したがって、ディレクトリのコンテキスト内で*使用する場合、すべてのファイルのワイルドカードとして使用できますcp。ファイル以外のすべてのファイルをコピーする方法はありxますか?

回答:


42

bash使用することができますextglob

 $ shopt -s extglob  # to enable extglob
 $ cp !(b*) new_dir/

ここで!(b*)、すべてのb*ファイルを除外します。

あなたは後から無効にすることができextglob

 $ shopt -u extglob

tcshシェルに相当するものがあるかどうか知っていますか?
レボン

残念ながら私はしません。ように思えるfind唯一の方法はであるtcshfind . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
急いで

50

Rsyncはこれをうまく処理します。

すべてコピーの例: rsync -aP /folder1/* /folder/2

すべてを除外してコピーする例: rsync -aP --exclude=x /folder1/* /folder2/

-aPスイッチ:

a cp -a:、再帰などに似ています。P:進行状況を表示します。rsyncの便利な機能です。


5
一般的なrsync除外リストの短いガイドについては、この回答を参照してください。
ジル 'SO-悪であるのをやめる

1
darwin / MacOSでは、再帰する場合の-rP代わりに使用し-aPます。-aアーカイブ用です。これが変更されたのか、MacOSで異なるだけなのかはわかりません。
jpoveda

rsync再帰的にするオプションがあります。例:rsync --recursive -P --exclude=x /folder1/* /folder2/。(Ubuntuでのみテスト済み)
n1k31t4

12

これはの機能ではなく、cpシェルの機能です(*すべての非ドットファイルを意味するように展開されます)。そのため、答えは使用しているシェルによって異なります。たとえば、zsh次の構文をサポートしています。

$ cp ^x /path/to/destination

どこ^x「を除くすべてのファイルを意味しx、」

また、選択パターンと選択解除パターンを組み合わせることもできます。たとえば、xyzを含むファイルを除くすべてのwavファイルをコピーするには、次を使用できます。

cp *.wav~*xyz*

についてのコメントはbash
チャドハリソン

@hydroparadise私はbashについてあまり知りませんが、この答えはそれをカバーしているようです
Michael Mrozek

tcshはどうですか?知ってる?
レボン

4

高度なシェルグロビングまたは組み込みの除外オプションを使用したコマンドを使用するよりもはるかにエレガントではない方法で、標準ツールを使用してさまざまな方法でプレーンオールド(ポータブル/互換)Bourneシェルで行うこともできます。

ファイルが多すぎない場合(およびスペースや改行を含む名前がない場合)、これは方法である可能性があります。

cp `ls | egrep -v '^excludename$'` destdir/.

もちろん、bashGNUツールは優れた強力なツールですが、常に利用できるとは限りません。移植性のあるスクリプトに入れるつもりならfind、ラッシュのコメントのようにお勧めします。


2
あなたの答えの最後の部分は、目前の話題から逸れるだけだと思います。その上、「Unix」はもはやゴールドスタンダードではありません(もしあったとしても)。このサイトのタイトルが「Unix and Linux」であるにもかかわらず、何かが「Unix」であるかどうかは関係ありません。
アレクサンダー

2
OK。代わりにコメントをここに移動しました:UnixはGNUではありません。物事の「統一性」はあまりおもしろくないことに同意しますが、私はまだ移植性とあなたの歴史について少し知っていると信じています。
-MattBianco

そこで完全に同意します。
アレクサンダー

2

フォルダ内のすべて(サブフォルダを含む)を特定のサブディレクトリにコピーする場合:

cp -R $(ls | grep -v '^subdir$') subdir/

sh、bash、zshで動作します(少なくとも)。


1
これは同じ意図ではないことを私に納得させるcp -R * subdir/
roaima

1
そのコマンド「cp -R * subdir /」を使用すると、bash / zshは再帰的に「subdir」をコピーしようとしました。「名前が長すぎます(コピーされません)」というエラーが発生します。
user2707671

いい視点ね。あなたの提案から警告を回避しようとしますcp(ないからbash/ sh「)cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’」。ただし、コピーは正しく完了します。残念ながら、バリアントは、スペースまたはシェル依存の句読点を含むファイル名で壊れます。参照してくださいunix.stackexchange.com/q/128985/135943
roaima

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