回答:
でbash
使用することができますextglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
ここで!(b*)
、すべてのb*
ファイルを除外します。
あなたは後から無効にすることができextglob
て
$ shopt -u extglob
find
唯一の方法はであるtcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsyncはこれをうまく処理します。
すべてコピーの例: rsync -aP /folder1/* /folder/2
すべてを除外してコピーする例: rsync -aP --exclude=x /folder1/* /folder2/
-aP
スイッチ:
a cp -a
:、再帰などに似ています。P:進行状況を表示します。rsyncの便利な機能です。
-rP
代わりに使用し-aP
ます。-a
アーカイブ用です。これが変更されたのか、MacOSで異なるだけなのかはわかりません。
rsync
再帰的にするオプションがあります。例:rsync --recursive -P --exclude=x /folder1/* /folder2/
。(Ubuntuでのみテスト済み)
これはの機能ではなく、cp
シェルの機能です(*
すべての非ドットファイルを意味するように展開されます)。そのため、答えは使用しているシェルによって異なります。たとえば、zsh
次の構文をサポートしています。
$ cp ^x /path/to/destination
どこ^x
「を除くすべてのファイルを意味しx
、」
また、選択パターンと選択解除パターンを組み合わせることもできます。たとえば、xyzを含むファイルを除くすべてのwavファイルをコピーするには、次を使用できます。
cp *.wav~*xyz*
bash
?
高度なシェルグロビングまたは組み込みの除外オプションを使用したコマンドを使用するよりもはるかにエレガントではない方法で、標準ツールを使用してさまざまな方法でプレーンオールド(ポータブル/互換)Bourneシェルで行うこともできます。
ファイルが多すぎない場合(およびスペースや改行を含む名前がない場合)、これは方法である可能性があります。
cp `ls | egrep -v '^excludename$'` destdir/.
もちろん、bash
GNUツールは優れた強力なツールですが、常に利用できるとは限りません。移植性のあるスクリプトに入れるつもりならfind
、ラッシュのコメントのようにお勧めします。
フォルダ内のすべて(サブフォルダを含む)を特定のサブディレクトリにコピーする場合:
cp -R $(ls | grep -v '^subdir$') subdir/
sh、bash、zshで動作します(少なくとも)。
cp -R * subdir/
cp
(ないからbash
/ sh
「)cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
」。ただし、コピーは正しく完了します。残念ながら、バリアントは、スペースまたはシェル依存の句読点を含むファイル名で壊れます。参照してくださいunix.stackexchange.com/q/128985/135943