Belirli bir alt dizindeki bazı dosyalar dışında bir dizindeki tüm dosyaları kopyalamak istiyorum. 'Cp' komutunun bir --exclude seçeneği olmadığını fark ettim. Peki, bunu nasıl başarabilirim?
tar -c | tar -x?
Belirli bir alt dizindeki bazı dosyalar dışında bir dizindeki tüm dosyaları kopyalamak istiyorum. 'Cp' komutunun bir --exclude seçeneği olmadığını fark ettim. Peki, bunu nasıl başarabilirim?
tar -c | tar -x?
Yanıtlar:
rsync hızlı ve kolaydır:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
--excludeBirden çok kez kullanabilirsiniz .
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
Dir thefoldertoexcludeafter --excludeseçeneğinin sourcefolder, ör sourcefolder/thefoldertoexclude.
Ayrıca -n, gerçek işlemi gerçekleştirmeden önce nelerin kopyalanacağını görmek için kuru çalıştırma ekleyebilirsiniz ve her şey yolundaysa, -nkomut satırından kaldırın .
--exclude
thefoldertoexcludegöreceli sourcefoldermi? teşekkürler
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolderiçin kullanacağım - zaten bulmak yerine rsync için upvote, çünkü kaynakta için mutlak yolları kolayca kullanabilirsiniz, çünkü dst'de olduğu gibi daha zor {}.
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/veya yerelden uzaktan kumandaya$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
Eh, belirli dosya adı kalıplarının dışlanması her unix-ish dosya yardımcı programı tarafından gerçekleştirilmek zorunda olsaydı (cp, mv, rm, tar, rsync, scp, ... gibi), çabaların muazzam bir kopyası olur. Bunun yerine, bu tür şeyler globbing'in bir parçası olarak , yani kabuğunuz tarafından yapılabilir .
man 1 bash, / extglob .
Misal:
$ shopt -s extglob $ echo images / * resimler / 004.bmp resimler / 033.jpg resimler / 1276338351183.jpg resimler / 2252.png $ echo images /! (*. jpg) images / 004.bmp images / 2252.png
Yani içine sadece bir desen koyarsınız !()ve bu maçı reddeder. Patern, bireysel yolların numaralandırılmasından başlayarak (Vanwaril'in başka bir cevapta gösterdiği gibi): !(filename1|path2|etc3)yıldız ve karakter sınıflarıyla normal ifade benzeri şeylere keyfi olarak karmaşık olabilir . Ayrıntılar için kılavuz sayfasına bakınız.
man 1 zshexpn, / dosya adı oluşturma .
setopt KSH_GLOBBash benzeri desenler yapabilir ve kullanabilirsiniz. Veya,
% setopt EXTENDED_GLOB % echo images / * resimler / 004.bmp resimler / 033.jpg resimler / 1276338351183.jpg resimler / 2252.png % echo images / * ~ * .jpg images / 004.bmp images / 2252.png
Böylece x~ydesenle eşleşir x, ancak desen hariçtir y. Bir kez daha, tüm detaylar için manpage'e bakınız.
Balık kabuk bir sahiptir daha güzel cevabı bu kadar:
🐟 cp (dize eşleşmesi -v '* .excluded.names' - srcdir / *) destdir
Yazın cp *, vurun CtrlX*ve sadece ne olduğunu görün. zararlı değil söz veriyorum
zsh.
setopt -u extglob.
Neden rsyncyapabileceğinizi kullanmalısınız :
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Bu, hedef dizin yapısının kaynağınkiyle aynı olduğunu varsayar.
-pathyol hiyerarşilerini test etmek için argümana ihtiyacın var, -iname değil
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync? Çünkü sistemde olmayabilir! iken find, cpher zaman yerlerinde. Ya da basit şeyler yapmak için 2gig malzeme yükleyen bir adam mısınız?
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 }
Bulduğum en kolay yol, dosya ve klasörler hariç tüm dosyaları yalnızca parantez içine ekleyerek kopyalayabileceğiniz en kolay yol:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
-bash: !: event not found
MVD'lerin yorumuna genişleyen bu benim için işe yarıyor
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
Kaynak dizine görecelidir.
Bu, dizinin source/.gitkopyalanmasını engelleyecektir.
rsync -r --exclude '.git' source target
rsync
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
ve önce nelerin kopyalanacağını görmek için -n seçeneği ile deneyin
Sanırım bash ya da tire kullanıyorsun. Bu işe yarar mı?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
İstemediğiniz dosyaları hariç bir ls yapmak ve bunu cp için ilk argüman olarak kullanmak
lsve basitçe yapabilirsiniz cp !(file1|file1) dest.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsyncaslında oldukça zor. çalışmasını sağlamak için birden fazla test yapmak zorunda.
Diyelim ki kopyalamak /var/www/htmlistediğiniz /var/www/devancak dizinin boyutu nedeniyle dizini hariç tutmanız gerekiyor /var/www/html/site/video/. Komut şöyle olur:
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
Bazı uyarılar :
/Kaynaktaki son eğik çizgi gereklidir, aksi takdirde içeriği yerine kaynak dizini de kopyalar ve olur /var/www/dev/html/xxxx, ki bu belki istediğiniz şey değildir.--excludeYolu göreli kaynağa doğrudan. Tam mutlak yol koymuş olsanız bile, çalışmaz.
-vayrıntılı için, özyineleme istediğiniz ve hemen hemen her şeyi korumak istediğiniz -aanlamına gelen arşiv modu içindir .
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
Düzenleme: Hedef yolu da hariç tutmayı unuttum (aksi takdirde yinelemeli olarak kopyalanır).
Bu Linus Klein'ın cevabının bir modifikasyonudur. Cevabı benim için işe yaramadı çünkü bir olurdu. cp'nin hoşlanmadığı dosya yolunun önüne eklendi (yol kaynak / .destination / file gibi görünecektir).
Bu komut benim için çalıştı:
find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;
--parents komutu dizin yapısını korur.
Geçici olarak gizli bir dizine taşıyın (ve istenirse daha sonra yeniden adlandırın).
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cpve standart bir POSIX kabuğu gibi bulduğum tek seçenek sh.
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/
Ben find komutunun çıktısını okumak için bir "do while" döngü kullanın. Bu örnekte, istediğimden daha fazla sayıda desen eşleşmesi olduğundan belirli desenleri eşleştiriyorum (hariç tutmak yerine). -İname bayraklarının önünde -not ile mantığı tersine çevirebilirsiniz:
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
Sunucumda, / media / wd dizinine taktığım Western Digital TV Live Hub'daki dosyalardan daha yeni olan tüm müzik türü dosyalarını kopyalamak için yukarıdakileri kullanıyorum. Yukarıdakileri kullanıyorum çünkü hariç tutmak istediğim bir sürü DVD dosyası, mpeg vb. bu komutla rsync sırasındaki hatalar:
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
İlk bölümde lsbayraklı gizli dosyalar hariç tüm dosyalar-I . Çıkışı lsikinci bölüm için standart girdi olarak kullanılır. Standart girişten xargskomut oluştur ve çalıştır cp -rf -t destdir. bayrak -raraçları dizinleri akıcı kopya -faraçlar içinde dosyaların üzerine hangi zorla dosyaları kopyalamak destdir, -thedef dizin kopyası belirtin.
cp -r ls -A | grep -v "Excluded_File_or_folder"../$target_location -v