Belirli bir desenle eşleşenler dışındaki bir dizindeki tüm dosyaları eşleştirmek için bazı kabuklardaki gelişmiş globbing desenlerini kullanabilirsiniz. Örneğin, ksh, bash veya zsh'de, komut
shopt -s extglob ## needed in bash only
setopt ksh_glob ## needed in zsh only
mv /source/!(*.bak) /destination
tüm dosyaları hareket edecek /source
için /destination
dosyaları eşleme için hariç *.bak
. Zsh'de, /source/^*.bak
ilk çalıştırdığınızda setopt extended_glob
ve daha genel olarak (tekrar gerektiren setopt extended_glob
) /source/*~*.bak
(veya /source/a*~*.bak
adı dosyalar a
hariç .bak
, vb. İle başlayan tüm dosyalar için ) yazabilirsiniz .
Zsh, bir kalıpla eşleşenler dışındaki tüm dosyaları taşımak için diğerlerinin yanı sıra kullanılabilecek bir toplu kopyalama / taşıma / bağlantı komutuna sahiptir. Örneğin, aşağıdaki komutu dışındaki tüm dosyaları taşır *.bak
gelen /source
etmek target
ve ekler .bak
süreçte Adlarının:
autoload zmv
zmv '/source/(*)~*.bak' '/target/$1.bak'
Etrafta rename
yüzen denilen birkaç komut vardır . Debian ve Ubuntu'da, /usr/bin/rename
dosyaları perl ifadesi tarafından oluşturulan yeni bir ada taşıyan bir perl betiğidir. Dosya hariç tutulacaksa, yeni bir ad oluşturmayarak dosyaları yeniden adlandırma işleminin dışında tutabilirsiniz. Örneğin, aşağıdaki komutu (bu özel kullanarak rename
programı) dışındaki tüm dosyaları taşır *.bak
gelen /source
için /target
:
rename 's!/source!/target! unless m!\.bak$!' /source/*
find
Taşımak istediğiniz dosyaları seçmek için komutu kullanabilirsiniz . Örneğin, aşağıdaki komutu dışındaki tüm düzenli dosyaları taşır *.bak
içinde /source
bir alt dizin veya /target
(dizin yapısı çökmüş olduğunu not):
find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
veya (taşınacak çok sayıda dosya varsa daha verimli)
find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
rsync
bir genellemedir cp
ve scp
çok güçlü / şunlardır kuralları hariç ile. Örneğin, aşağıdaki komut dizin yapısına bağlı *.bak
olarak /source
veya alt dizin dışındaki tüm dosyaları içine kopyalar /target
:
rsync -a --exclude '*.bak' /source/ /target/
pax
(diğer şeylerin yanı sıra) cp
steroidlerde başka bir şeydir . Dışlama kuralları neredeyse rsync'ler kadar güçlü değildir, ancak kopyalandıkça dosyaları yeniden adlandırma özelliğine sahiptir. Bir dosyayı boş dizeye yeniden adlandırırsanız, dosya kopyadan çıkarılır. Örneğin, haricinde, aşağıdaki komutu kopyalar tüm dosyaları *.bak
içinde /source
veya içine bir alt dizin /target
ve dosyaları yeniden adlandırır .bak
geçerken.
cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
Yukarıdaki örnek foo.bak
, şu şekilde bir araya getirilerek önlenebilecek dizinler oluşturmanın talihsiz yan etkisine find
sahiptir pax
:
{ cd /source && find . -type f; } | \
pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
mv file1 file2 /path/to/destination
bunu yapmak istediğini yapmayacağım inanıyorum