すべてのファイルではなく一部のファイルをコピーするにはどうすればよいでしょうか?

すべてのファイルではなく一部のファイルをコピーするにはどうすればよいでしょうか?

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

答え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/.

確かに、bashGNU ツールは優れていて強力ですが、それでも常に利用できるとは限りません。移植可能なスクリプトに組み込むつもりなら、findRush のコメントにあるようにすることをお勧めします。

関連情報