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 /sourceiçin /destinationdosyaları eşleme için hariç *.bak. Zsh'de, /source/^*.bakilk çalıştırdığınızda setopt extended_globve daha genel olarak (tekrar gerektiren setopt extended_glob) /source/*~*.bak(veya /source/a*~*.bakadı dosyalar ahariç .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 *.bakgelen /sourceetmek targetve ekler .baksüreçte Adlarının:
autoload zmv
zmv '/source/(*)~*.bak' '/target/$1.bak'
Etrafta renameyüzen denilen birkaç komut vardır . Debian ve Ubuntu'da, /usr/bin/renamedosyaları 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 renameprogramı) dışındaki tüm dosyaları taşır *.bakgelen /sourceiçin /target:
rename 's!/source!/target! unless m!\.bak$!' /source/*
findTaşı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 *.bakiçinde /sourcebir 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/ {} +
rsyncbir genellemedir cpve scpçok güçlü / şunlardır kuralları hariç ile. Örneğin, aşağıdaki komut dizin yapısına bağlı *.bakolarak /sourceveya alt dizin dışındaki tüm dosyaları içine kopyalar /target:
rsync -a --exclude '*.bak' /source/ /target/
pax(diğer şeylerin yanı sıra) cpsteroidlerde 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ı *.bakiçinde /sourceveya içine bir alt dizin /targetve dosyaları yeniden adlandırır .bakgeç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 findsahiptir pax:
{ cd /source && find . -type f; } | \
pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
mv file1 file2 /path/to/destinationbunu yapmak istediğini yapmayacağım inanıyorum