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