web-dev-qa-db-ja.com

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

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

59
Chad Harrison

bashでは、extglobを使用できます。

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

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

後でextglobを無効にできます

_ $ shopt -u extglob
_
46
rush

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

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

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

-aPスイッチ:

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

54
Tim

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

$ cp ^x /path/to/destination

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

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

cp *.wav~*xyz*
12
Michael Mrozek

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

ファイルが多すぎない(スペースや改行を含む名前のない)ファイルの場合、これは1つの方法です。

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

確かに、bashとGNUツールは優れた強力なツールですが、常に使用できるとは限りません。移植可能なスクリプトに含める場合は、find Rushのコメントのように。

4
MattBianco

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

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

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

2
user2707671