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
--exclude
Birden çok kez kullanabilirsiniz .
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
Dir thefoldertoexclude
after --exclude
seç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, -n
komut satırından kaldırın .
--exclude
thefoldertoexclude
göreceli sourcefolder
mi? teşekkürler
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
iç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_GLOB
Bash 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~y
desenle 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 rsync
yapabileceğ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.
-path
yol 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
, cp
her 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/.git
kopyalanması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
ls
ve basitçe yapabilirsiniz cp !(file1|file1) dest
.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
aslında oldukça zor. çalışmasını sağlamak için birden fazla test yapmak zorunda.
Diyelim ki kopyalamak /var/www/html
istediğiniz /var/www/dev
ancak 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.--exclude
Yolu göreli kaynağa doğrudan. Tam mutlak yol koymuş olsanız bile, çalışmaz.
-v
ayrıntılı için, özyineleme istediğiniz ve hemen hemen her şeyi korumak istediğiniz -a
anlamı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
cp
ve 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 ls
bayraklı gizli dosyalar hariç tüm dosyalar-I
. Çıkışı ls
ikinci bölüm için standart girdi olarak kullanılır. Standart girişten xargs
komut oluştur ve çalıştır cp -rf -t destdir
. bayrak -r
araçları dizinleri akıcı kopya -f
araçlar içinde dosyaların üzerine hangi zorla dosyaları kopyalamak destdir
, -t
hedef dizin kopyası belirtin.
cp -r ls -A | grep -v "Excluded_File_or_folder"
../$target_location -v