特定のサブディレクトリ内の一部のファイルを除いて、ディレクトリ内のすべてのファイルをコピーしたいと考えています。cpコマンドに--excludeオプションがないことに気付きました。では、どうすればこれを達成できますか?
20 に答える
rsync速くて簡単です:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
何回でも使えます--exclude。
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
オプションのthefoldertoexclude後の dir は に対して相対的であることに注意してください。--excludesourcefoldersourcefolder/thefoldertoexclude
また、ドライラン用に追加-nして、実際の操作を実行する前に何がコピーされるかを確認し、問題がなければ-nコマンド ラインから削除することもできます。
まあ、特定のファイル名パターンの除外がすべての 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*し、何が起こるかを確認してください。害はありません約束します
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.
cp -r `ls -A | grep -v "c"` $HOME/
これは、ソース ディレクトリに相対的です。
これにより、ディレクトリsource/.gitがコピーされなくなります。
rsync -r --exclude '.git' source target
mvds のコメントを拡張すると、これは私にとってはうまくいきます
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
編集:ターゲットパスも除外するのを忘れていました(そうしないと、再帰的にコピーされます)。
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 の最初の引数として使用する
別のより簡単なオプションは、 --exclude-dir オプションがあり、ローカル ファイルとリモート ファイルの両方に使用できる rsync をインストールして使用することです。
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/
2022 年 1 月更新:
これが最も簡単な方法です (複雑ではありません)。
まず、「一時」フォルダーを作成します。
mkdir temp
次に、すべてのファイルを元のフォルダーから「一時」フォルダーにコピーします。
「-R」フラグは、「シンボリックリンク」を含むすべてのファイルを正確にコピーできます
cp -R originalFolder/. temp/
3 番目に、 「temp」フォルダーから「myFolder」を削除します。
rm temp/myFolder
最後に、すべてのファイルを「一時」フォルダーから目的のフォルダーにコピーします。
cp -R temp/. destinationFolder/
さらに、これは「一時」フォルダーを使用しない最短の方法です。
cp -R originalFolder/!(myFolder) destinationFolder/