Saya ingin menyalin semua file dalam direktori kecuali beberapa file dalam sub-direktori tertentu. Saya perhatikan bahwa perintah 'cp' tidak memiliki opsi --exclude. Jadi, bagaimana saya bisa mencapai ini?
tar -c | tar -x?
Saya ingin menyalin semua file dalam direktori kecuali beberapa file dalam sub-direktori tertentu. Saya perhatikan bahwa perintah 'cp' tidak memiliki opsi --exclude. Jadi, bagaimana saya bisa mencapai ini?
tar -c | tar -x?
Jawaban:
rsync cepat dan mudah:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
Anda dapat menggunakan --excludebeberapa kali.
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
Perhatikan bahwa opsi dir thefoldertoexcludesetelah --excluderelatif terhadap sourcefolder, yaitu sourcefolder/thefoldertoexclude,.
Anda juga dapat menambahkan -nuntuk menjalankan kering untuk melihat apa yang akan disalin sebelum melakukan operasi nyata, dan jika semuanya ok, hapus -ndari baris perintah.
--exclude
thefoldertoexcluderelatif ke sourcefolderatau direktori kerja saat ini? terima kasih
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder- tetap upvote untuk rsync daripada menemukan, karena Anda dapat dengan mudah menggunakan jalur absolut untuk sumber sementara dalam menemukan itu lebih sulit karena menggunakan {}di dst.
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/atau dari lokal ke jarak jauh$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
Nah, jika pengecualian pola nama file tertentu harus dilakukan oleh setiap utilitas file unix-ish (seperti cp, mv, rm, tar, rsync, scp, ...), duplikasi usaha yang sangat besar akan terjadi. Sebaliknya, hal-hal seperti itu dapat dilakukan sebagai bagian dari globbing , yaitu dengan shell Anda.
man 1 bash, / extglob .
Contoh:
$ shopt -s extglob $ echo images / * images / 004.bmp images / 033.jpg images / 1276338351183.jpg images / 2252.png $ echo images /! (*. jpg) images / 004.bmp images / 2252.png
Jadi Anda hanya memasukkan pola di dalamnya !(), dan meniadakan pertandingan. Polanya bisa rumit secara arbitrer, mulai dari penghitungan jalur individu (seperti yang ditunjukkan Vanwaril dalam jawaban lain):, !(filename1|path2|etc3)hingga hal-hal yang mirip dengan regex dengan bintang dan kelas karakter. Lihat halaman manual untuk detailnya.
man 1 zshexpn, / nama file generasi .
Anda dapat melakukan setopt KSH_GLOBdan menggunakan pola bash-like. Atau,
% setopt EXTENDED_GLOB % Gema gambar / * images / 004.bmp images / 033.jpg images / 1276338351183.jpg images / 2252.png % echo images / * ~ * .jpg images / 004.bmp images / 2252.png
Jadi x~ycocok dengan pola x, tetapi tidak termasuk pola y. Sekali lagi, untuk detail selengkapnya, lihat halaman manual.
The ikan shell memiliki banyak jawaban cantik ini:
🐟 cp (string match -v '* .excluded.names' - srcdir / *) destdir
Ketik cp *, tekan CtrlX*dan lihat apa yang terjadi. itu tidak berbahaya, aku janji
zsh.
setopt -u extglob.
Mengapa menggunakan rsyncketika Anda bisa melakukan:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Ini mengasumsikan struktur direktori target sama dengan sumbernya.
-pathargumen untuk menguji hierarki jalur, bukan -nama
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync? Karena mungkin tidak ada dalam sistem! sementara find, cpselalu ada di tempat mereka. Atau Anda dari jenis cowok, yang memasang 2 gram barang untuk melakukan hal-hal sederhana?
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 }
Cara termudah yang saya temukan, di mana Anda dapat menyalin semua file tidak termasuk file dan folder hanya dengan menambahkan nama mereka di dalam tanda kurung:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
-bash: !: event not found
Memperluas komentar mvds , ini bekerja untuk saya
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
Ini relatif terhadap direktori sumber.
Ini akan mengecualikan direktori source/.gitdari disalin.
rsync -r --exclude '.git' source target
rsync
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
dan pertama coba dengan opsi -n untuk melihat apa yang akan disalin
Saya menganggap Anda menggunakan bash atau dash. Apakah ini akan berhasil?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
Melakukan ls mengecualikan file yang tidak Anda inginkan, dan menggunakannya sebagai argumen pertama untuk cp
lsdan cukup lakukan cp !(file1|file1) dest.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsyncsebenarnya cukup rumit. harus melakukan beberapa tes untuk membuatnya berfungsi.
Katakanlah Anda ingin menyalin /var/www/htmlke /var/www/devtapi perlu mengecualikan /var/www/html/site/video/ direktori mungkin karena ukurannya. Perintahnya adalah:
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
Beberapa peringatan :
/pada sumber diperlukan, jika tidak, salin juga akan menyalin direktori sumber daripada isinya dan menjadi /var/www/dev/html/xxxx, yang mungkin bukan yang Anda inginkan.The para --excludepath adalah relatif ke sumber langsung. Bahkan jika Anda meletakkan jalur absolut penuh, itu tidak akan berhasil.
-vadalah untuk verbose, -aadalah untuk mode arsip yang berarti Anda ingin rekursi dan ingin mempertahankan hampir semuanya.
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
Sunting: lupa untuk mengecualikan jalur target juga (kalau tidak itu akan menyalin secara rekursif).
Ini adalah modifikasi dari jawaban Linus Kleen. Jawabannya tidak berhasil untuk saya karena akan ada. ditambahkan di depan path file yang tidak disukai cp (path akan terlihat seperti source / .destination / file).
Perintah ini bekerja untuk saya:
find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;
perintah --parents menjaga struktur direktori.
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/
Hanya memindahkannya sementara ke direktori tersembunyi (dan ganti namanya setelah, jika diinginkan).
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cpdan shell POSIX standar seperti sh.
Saya menggunakan loop "do while" untuk membaca output dari perintah find. Dalam contoh ini, saya mencocokkan (daripada mengecualikan) pola tertentu karena ada jumlah pencocokan pola yang lebih terbatas yang saya inginkan daripada yang tidak saya inginkan. Anda bisa membalikkan logika dengan -tidak di depan flag -iname:
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
Saya menggunakan hal di atas untuk menyalin semua file jenis musik yang lebih baru di server saya daripada file di Western Digital TV Live Hub yang telah saya pasang di / media / wd. Saya menggunakan hal di atas karena saya memiliki banyak file DVD, mpegs, dll. Saya ingin mengecualikan DAN karena untuk beberapa alasan rsync sepertinya sedang menyalin, tetapi setelah saya melihat perangkat wd, file tidak ada walaupun tidak ada kesalahan selama rsync dengan perintah ini:
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/
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir
Bagian pertama lssemua file tetapi menyembunyikan file tertentu dengan flag -I. Output dari lsdigunakan sebagai input standar untuk bagian kedua. xargsmembangun dan menjalankan perintah cp -rf -t destdirdari input standar. bendera -rberarti menyalin direktori secara rekursif, -fberarti menyalin file secara paksa yang akan menimpa file dalam destdir, -tmenentukan salinan direktori tujuan.
cp -r ls -A | grep -v "Excluded_File_or_folder"../$target_location -v