したがって、ディレクトリのコンテキスト内でcp
を使用する場合、*
をすべてのファイルのワイルドカードとして使用できます。 x
ファイル以外のすべてのファイルをコピーする方法はありますか?
bash
では、extglob
を使用できます。
_ $ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
_
ここで、!(b*)
はすべての_b*
_ファイルを除外します。
後でextglob
を無効にできます
_ $ shopt -u extglob
_
Rsyncはこれをうまく処理します。
すべてコピーする例:rsync -aP /folder1/* /folder/2
例:すべてを除外してコピー:rsync -aP --exclude=x /folder1/* /folder2/
-aP
スイッチ:
a:cp -a
、再帰的などに似ています。P:進行状況を表示します。rsyncの素晴らしい機能です。
これはcp
の機能ではなく、シェルの機能です(*
は、すべての非ドットファイルを意味します)。したがって、答えは、使用しているシェルによって異なります。たとえば、zsh
は次の構文をサポートしています。
$ cp ^x /path/to/destination
どこ ^x
は、「x
を除くすべてのファイル」を意味します
選択パターンと選択解除パターンを組み合わせることもできます。 xyzを含むものを除くすべてのwavファイルをコピーするには、次のコマンドを使用できます。
cp *.wav~*xyz*
プレーンな古い(ポータブル/互換性のある)ボーンシェルでも、標準のツールを使用してさまざまな方法で、高度なシェルグロビングや組み込みの除外オプションを持つコマンドを使用するよりもはるかにエレガントな方法で実行できます。
ファイルが多すぎない(スペースや改行を含む名前のない)ファイルの場合、これは1つの方法です。
cp `ls | egrep -v '^excludename$'` destdir/.
確かに、bash
とGNUツールは優れた強力なツールですが、常に使用できるとは限りません。移植可能なスクリプトに含める場合は、find
Rushのコメントのように。
フォルダー(サブフォルダーを含む)のすべてを特定のサブディレクトリにコピーする場合:
cp -R $(ls | grep -v '^subdir$') subdir/
Sh、bash、zsh(少なくとも)で動作します。