特定のサブディレクトリ内の一部のファイルを除いて、ディレクトリ内のすべてのファイルをコピーしたい。「cp」コマンドに--excludeオプションがないことに気づきました。それで、どうすればこれを達成できますか?
tar -c | tar -x
?
特定のサブディレクトリ内の一部のファイルを除いて、ディレクトリ内のすべてのファイルをコピーしたい。「cp」コマンドに--excludeオプションがないことに気づきました。それで、どうすればこれを達成できますか?
tar -c | tar -x
?
回答:
rsyncは高速で簡単です。
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
--exclude
複数回使用できます。
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
dirのことを注意thefoldertoexclude
した後--exclude
オプションがに相対的であるsourcefolder
、すなわち、sourcefolder/thefoldertoexclude
。
また-n
、予行演習を追加して、実際の操作を実行する前に何がコピーされるかを確認し、問題がなければ-n
、コマンドラインから削除します。
--exclude
thefoldertoexclude
と比較しsourcefolder
たり、現在の作業ディレクトリは?感謝
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
-とにかく、検索の代わりにrsyncに賛成票を投じます。検索中にソースの絶対パスを簡単に使用できるため{}
、dst でを使用するのでトリッキーです。
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/
またはローカルからリモートへ$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
まあ、特定のファイル名パターンの除外をすべてのunixっぽいファイルユーティリティ(cp、mv、rm、tar、rsync、scpなど)で実行する必要がある場合、膨大な作業の重複が発生します。代わりに、そのようなことはグロビングの一部として、つまりシェルによって行うことができます。
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)
ように)個々のパスの列挙から始まり、星や文字クラスの正規表現のようなものまで、パターンは任意に複雑にすることができます。詳細は、マンページを参照してください。
man 1 zshexpn
、/ ファイル名生成。
setopt KSH_GLOB
bashのようなパターンを使用できます。または、
%setopt EXTENDED_GLOB %エコー画像/ * images / 004.bmp images / 033.jpg images / 1276338351183.jpg images / 2252.png %エコー画像/*~*.jpg images / 004.bmp images / 2252.png
したがって、x~y
パターンx
に一致しますが、パターンを除外しますy
。繰り返しますが、詳細についてはマンページを参照してください。
🐟cp(string match -v '* .excluded.names'-srcdir / *)destdir
と入力cp *
してヒットしCtrlX*、何が起こるかを確認します。それは私が約束する害はありません
zsh
ます。
setopt -u extglob
ます。
できるrsync
ときに使用する理由:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
これは、ターゲットのディレクトリ構造がソースと同じであることを前提としています。
-path
-inameではなくパス階層をテストするための引数が必要だと思います
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync
?システムに存在しない可能性があります!ながらfind
、cp
常に自分の場所にいます。それとも、単純なことをするために2ギグのものをインストールしたような人からですか?
cp -r `ls -A | grep -v "c"` $HOME/
# $1 = source path # $2 = destination path # $3 = filter copy_from_source_to_destination_except_filter() { cp -r $(ls -A $1 | grep -v -w $3 | awk -v path=$1 '{printf "%s/%s ", path, $1}') $2 }
これは、ソースディレクトリを基準にしています。
これにより、ディレクトリsource/.git
がコピーから除外されます。
rsync -r --exclude '.git' source target
rsync
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
そして最初に-nオプションを付けて試して、何がコピーされるかを確認します
私はあなたが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の最初の引数として使用する
ls
をスキップし、単に行うことができますcp !(file1|file1) dest
。
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
実際にはかなりトリッキーです。機能させるには、複数のテストを実行する必要があります。
コピー/var/www/html
したい/var/www/dev
が、おそらくサイズが原因でディレクトリを除外する 必要があるとしましょう/var/www/html/site/video/
。コマンドは次のようになります。
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
いくつかの警告:
/
ソースの最後のスラッシュが必要です。それ以外の場合は、コンテンツではなくソースディレクトリもコピーされ、に/var/www/dev/html/xxxx
なります。これは、おそらく希望どおりではありません。--exclude
パスは、相対的な直接ソースへ。完全な絶対パスを指定しても機能しません。
-v
は冗長用で-a
あり、アーカイブモード用です。つまり、再帰が必要で、ほとんどすべてを保持したいということです。
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
編集:ターゲットパスも除外するのを忘れました(そうしないと、再帰的にコピーされます)。
一時的に隠しディレクトリに移動するだけです(必要に応じて、後で名前を変更します)。
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cp
あり、のような標準のPOSIXシェルで動作しsh
ます。
「do while」ループを使用して、findコマンドの出力を読み取ります。この例では、特定のパターンを(除外するのではなく)一致させています。これは、不要なパターン一致よりも必要なパターン一致の数が限られているためです。-inameフラグの前に-notを付けると、ロジックを逆にすることができます。
find . -type f -iname "*.flac" -o -print0 -iname "*.mp3" -print0 -o -iname "*.wav" -print0 -o -iname "*.aac" -print0 -o -iname "*.wma" -print0 | while read -d $'\0' file; do cp -ruv "$file" "/media/wd/network_sync/music/$file"; done
上記を使用して、/ media / wdにマウントしたWestern Digital TV Live Hub上のファイルよりもサーバー上で新しいすべての音楽タイプファイルをコピーします。上記を使用しているのは、除外したいDVDファイルやmpegなどがたくさんあり、かつ、何らかの理由でrsyncがコピーしているように見えるためですが、wdデバイスを確認した後、ファイルがありませんこのコマンドでのrsync中のエラー:
rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/
cp -r ls -A | grep -v "Excluded_File_or_folder"
../$target_location -v