Anda dapat menggunakan pola globbing lanjutan di beberapa shell untuk mencocokkan semua file dalam direktori kecuali untuk mereka yang cocok dengan pola tertentu. Misalnya, dalam ksh, bash atau zsh, perintah
shopt -s extglob ## needed in bash only
setopt ksh_glob ## needed in zsh only
mv /source/!(*.bak) /destination
akan memindahkan semua file /source
ke /destination
kecuali untuk file yang cocok *.bak
. Di zsh, Anda juga dapat menulis /source/^*.bak
jika Anda pertama kali menjalankan setopt extended_glob
, dan lebih umum (lagi-lagi membutuhkan setopt extended_glob
) /source/*~*.bak
(atau /source/a*~*.bak
untuk semua file yang namanya dimulai a
kecuali untuk .bak
file, dll).
Zsh memiliki perintah penyalinan / pemindahan / tautan massal yang dapat digunakan, antara lain, untuk memindahkan semua file kecuali untuk yang cocok dengan suatu pola. Misalnya, perintah berikut memindahkan semua file kecuali *.bak
dari /source
ke target
, dan menambahkan .bak
nama mereka dalam proses:
autoload zmv
zmv '/source/(*)~*.bak' '/target/$1.bak'
Ada beberapa perintah yang disebut rename
melayang. Di Debian dan Ubuntu, /usr/bin/rename
adalah skrip perl yang memindahkan file ke nama baru yang dihasilkan oleh ekspresi perl. Anda dapat mengecualikan file dari penggantian nama dengan tidak menghasilkan nama baru jika file tersebut akan dikecualikan. Misalnya, perintah berikut (menggunakan rename
program khusus ini) memindahkan semua file kecuali *.bak
dari /source
ke /target
:
rename 's!/source!/target! unless m!\.bak$!' /source/*
Anda dapat menggunakan find
perintah untuk memilih file yang ingin Anda pindahkan. Sebagai contoh, perintah berikut memindahkan semua file biasa kecuali *.bak
dalam /source
atau subdirektori ke /target
(perhatikan bahwa struktur direktori diciutkan):
find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
atau (lebih efisien jika ada banyak file untuk dipindahkan)
find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
rsync
adalah generalisasi dari cp
dan scp
dengan aturan termasuk / tidak termasuk yang sangat kuat. Sebagai contoh, perintah berikut menyalin semua file kecuali *.bak
dalam /source
atau subdirektori ke /target
, dengan menghormati struktur direktori:
rsync -a --exclude '*.bak' /source/ /target/
pax
adalah (antara lain) cp
steroid. Aturan pengecualiannya tidak sekuat rsync, tetapi memiliki kemampuan tambahan untuk mengganti nama file saat disalin. Jika Anda mengganti nama file menjadi string kosong, itu dikecualikan dari salinan. Sebagai contoh, perintah berikut menyalin semua file kecuali *.bak
dalam /source
atau subdirektori ke /target
, dan mengganti nama file menjadi .bak
lewat.
cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
Contoh di atas memiliki efek samping yang tidak diinginkan dalam membuat direktori yang disebut foo.bak
, yang dapat dihindari dengan menggabungkan find
dengan pax
:
{ cd /source && find . -type f; } | \
pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
mv file1 file2 /path/to/destination
tidak akan melakukan apa yang Anda inginkan