Böylece, bir dizinin içeriğini *
kullanırken tüm dosyalar için joker karakter olarak kullanabilirsiniz cp
. Dosya dışındaki tüm dosyaları kopyalamanın bir yolu var mı x
?
Böylece, bir dizinin içeriğini *
kullanırken tüm dosyalar için joker karakter olarak kullanabilirsiniz cp
. Dosya dışındaki tüm dosyaları kopyalamanın bir yolu var mı x
?
Yanıtlar:
İçinde bash
kullanabilirsiniz extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
nerede !(b*)
tüm dışlamak b*
dosyaları.
Daha sonra devre dışı bırakabilirsiniz extglob
ile
$ shopt -u extglob
find
tek yol tcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync bunu çok iyi idare ediyor.
Örnek hepsini kopyala: rsync -aP /folder1/* /folder/2
Hariç tutulan tüm örnek kopya: rsync -aP --exclude=x /folder1/* /folder2/
-aP
anahtar:
a: Benzer cp -a
, özyinelemeli vb. P: İlerlemeyi gösterir, rsync'in güzel bir özelliği.
-rP
yerine kullanın -aP
. -a
arşivleme içindir. Bunun değişip değişmediğinden veya MacOS'ta farklı olup olmadığından emin değilsiniz.
rsync
özyinelemeli yapmak için seçeneğiniz var. Örnek: rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Sadece Ubuntu'da test edilmiştir)
Bu bir özellik değil cp
, kabuğunuzun bir özelliğidir ( *
nokta olmayan tüm dosyaları ifade edecek şekilde genişler ), bu nedenle cevap kullandığınız kabuğa göre değişir. Örneğin, zsh
bu sözdizimini destekler:
$ cp ^x /path/to/destination
Nerede ^x
"dışındaki tüm dosyalar anlamına x
"
Ayrıca, seçim ve seçim kalıplarını da kaldırabilirsiniz, örneğin xyz içerenler dışındaki tüm wav dosyalarını kopyalamak için, şunları kullanabilirsiniz:
cp *.wav~*xyz*
bash
mı?
Ayrıca düz eski (portatif / uyumlu) bourne kabuğunda, standart aletlerle, gelişmiş kabuk kürecilik veya yerleşik dışlama seçeneklerine sahip komutlar kullanmaktan çok daha az zarif bir şekilde çeşitli şekillerde yapılabilir.
Çok fazla dosya yoksa (ve boşluklar ve / veya satır çizgiler dahil isimlerle), bu bir yol olabilir:
cp `ls | egrep -v '^excludename$'` destdir/.
Elbette bash
ve GNU araçları harika ve güçlü, ancak yine de her zaman kullanılamıyorlar. Taşınabilir bir betiğe koymayı düşünüyorsanız, find
Rush'ın yorumundaki gibi öneririm .
Bir klasördeki her şeyi (alt klasörler dahil) belirli bir alt dizine kopyalamak istiyorsanız:
cp -R $(ls | grep -v '^subdir$') subdir/
Sh, bash, zsh (en azından) ile çalışır.
cp -R * subdir/
cp
dan bash
/ değil sh
" uyarısından kaçınmaya çalışır cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
. Kopyalama yine de doğru bir şekilde tamamlandı. Maalesef varyantınız, boşluk veya kabuğa duyarlı noktalama işareti içeren herhangi bir dosya adını kırar. Bkz. Unix.stackexchange.com/q/128985/135943
extglob
Sanırım şu ana kadarki en iyi yol.
Başka bir yol kullanıyor
cp $(ls --ignore=x) subdir/
$
vb.) Çıktısını asla ayrıştırmaz ls
. unix.stackexchange.com/q/128985/135943