576

特定のサブディレクトリ内の一部のファイルを除いて、ディレクトリ内のすべてのファイルをコピーしたいと考えています。cpコマンドに--excludeオプションがないことに気付きました。では、どうすればこれを達成できますか?

4

20 に答える 20

970

rsync速くて簡単です:

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

何回でも使えます--exclude

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude

オプションのthefoldertoexclude後の dir は に対して相対的であることに注意してください。--excludesourcefoldersourcefolder/thefoldertoexclude

また、ドライラン用に追加-nして、実際の操作を実行する前に何がコピーされるかを確認し、問題がなければ-nコマンド ラインから削除することもできます。

于 2013-02-09T15:04:45.373 に答える
114

まあ、特定のファイル名パターンの除外がすべての UNIX っぽいファイル ユーティリティ (cp、mv、rm、tar、rsync、scp など) によって実行されなければならない場合、労力の膨大な重複が発生します。代わりに、そのようなことはglobbingの一部として、つまりシェルによって行うことができます。

バッシュ

man 1 bash/ extglob

例:

$ shopt -s extglob
$エコー画像/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
$ echo images/!(*.jpg)
images/004.bmp images/2252.png

したがって、 の中にパターンを入れるだけ!()で、一致が否定されます。パターンは、個々のパスの列挙 (Vanwaril が別の回答で示しているように) から始まり、!(filename1|path2|etc3)スターと文字クラスを持つ正規表現のようなものまで、任意に複雑にすることができます。詳細については、マンページを参照してください。

zsh

man 1 zshexpn/ ファイル名の生成

setopt KSH_GLOBbash のようなパターンを実行および使用できます。または、

% setopt EXTENDED_GLOB
% エコー画像/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% echo images/*~*.jpg
images/004.bmp images/2252.png

したがって、 x~ypattern に一致しますxが、 pattern は除外しますy。繰り返しになりますが、完全な詳細についてはマンページを参照してください。


新しい魚

の殻には、これに対するはるかに優れた答えがあります。

cp (文字列一致 -v '*.excluded.names' -- srcdir/*) destdir

ボーナスのヒント

と入力cp *してヒットCtrlX*し、何が起こるかを確認してください。害はありません約束します

于 2011-11-11T00:53:20.263 に答える
60

Why use rsync when you can do:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

This assumes the target directory structure being the same as the source's.

于 2011-01-03T16:04:39.073 に答える
44
cp -r `ls -A | grep -v "c"` $HOME/
于 2012-10-19T06:37:13.610 に答える
21

これは、ソース ディレクトリに相対的です。
これにより、ディレクトリsource/.gitがコピーされなくなります。

rsync -r --exclude '.git' source target
于 2018-02-28T10:14:19.747 に答える
17

mvds のコメントを拡張すると、これは私にとってはうまくいきます

cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
于 2012-06-25T04:46:31.000 に答える
7
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir

編集:ターゲットパスも除外するのを忘れていました(そうしないと、再帰的にコピーされます)。

于 2011-01-03T16:00:05.047 に答える
7

bashまたはdashを使用していると思います。これは機能しますか?

shopt -s extglob  # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination

不要なファイルを除外して ls を実行し、それを cp の最初の引数として使用する

于 2011-01-03T16:07:27.770 に答える
5

別のより簡単なオプションは、 --exclude-dir オプションがあり、ローカル ファイルとリモート ファイルの両方に使用できる rsync をインストールして使用することです。

于 2011-01-03T17:21:16.007 に答える
1
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/
于 2012-03-25T00:22:11.327 に答える
0

2022 年 1 月更新:

これが最も簡単な方法です (複雑ではありません)。

まず、「一時」フォルダーを作成します。

mkdir temp

次に、すべてのファイルを元のフォルダーから「一時」フォルダーにコピーします。

「-R」フラグは、「シンボリックリンク」を含むすべてのファイルを正確にコピーできます

cp -R originalFolder/. temp/

3 番目に、 「temp」フォルダーから「myFolder」を削除します。

rm temp/myFolder

最後に、すべてのファイルを「一時」フォルダーから目的のフォルダーにコピーします。

cp -R temp/. destinationFolder/

さらに、これは「一時」フォルダーを使用しない最短の方法です。

cp -R originalFolder/!(myFolder) destinationFolder/
于 2022-01-12T23:59:45.257 に答える