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 --exclude
beberapa kali.
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
Perhatikan bahwa opsi dir thefoldertoexclude
setelah --exclude
relatif terhadap sourcefolder
, yaitu sourcefolder/thefoldertoexclude
,.
Anda juga dapat menambahkan -n
untuk menjalankan kering untuk melihat apa yang akan disalin sebelum melakukan operasi nyata, dan jika semuanya ok, hapus -n
dari baris perintah.
--exclude
thefoldertoexclude
relatif ke sourcefolder
atau 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_GLOB
dan 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~y
cocok 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 rsync
ketika Anda bisa melakukan:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Ini mengasumsikan struktur direktori target sama dengan sumbernya.
-path
argumen 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
, cp
selalu 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/.git
dari 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
ls
dan cukup lakukan cp !(file1|file1) dest
.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
sebenarnya cukup rumit. harus melakukan beberapa tes untuk membuatnya berfungsi.
Katakanlah Anda ingin menyalin /var/www/html
ke /var/www/dev
tapi 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 --exclude
path adalah relatif ke sumber langsung. Bahkan jika Anda meletakkan jalur absolut penuh, itu tidak akan berhasil.
-v
adalah untuk verbose, -a
adalah 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
cp
dan 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 ls
semua file tetapi menyembunyikan file tertentu dengan flag -I
. Output dari ls
digunakan sebagai input standar untuk bagian kedua. xargs
membangun dan menjalankan perintah cp -rf -t destdir
dari input standar. bendera -r
berarti menyalin direktori secara rekursif, -f
berarti menyalin file secara paksa yang akan menimpa file dalam destdir
, -t
menentukan salinan direktori tujuan.
cp -r ls -A | grep -v "Excluded_File_or_folder"
../$target_location -v