Ви можете використовувати розширені шаблони глобалізації в деяких оболонках, щоб відповідати всім файлам у каталозі, за винятком тих, що відповідають певному шаблону. Наприклад, команда в ksh, bash або zsh
shopt -s extglob ## needed in bash only
setopt ksh_glob ## needed in zsh only
mv /source/!(*.bak) /destination
перемістить усі файли /source
до, /destination
за винятком відповідності файлів *.bak
. У zsh ви також можете записати, /source/^*.bak
якщо ви запускаєте спочатку setopt extended_glob
, і в більш загальному випадку (знову вимагається setopt extended_glob
) /source/*~*.bak
(або /source/a*~*.bak
для всіх файлів, ім’я яких починається за a
винятком .bak
файлів тощо).
Zsh має масову команду копіювання / переміщення / посилання, яку можна використовувати, серед інших, для переміщення всіх файлів, крім тих, що відповідають шаблону. Наприклад, наступна команда переміщує всі файли, крім *.bak
від /source
до target
, і додає .bak
до їх імені в процесі:
autoload zmv
zmv '/source/(*)~*.bak' '/target/$1.bak'
Є кілька команд, які називаються rename
плаваючими навколо. На Debian і Ubuntu /usr/bin/rename
- це сценарій perl, який переміщує файли до нового імені, згенерованого виразом perl. Ви можете виключити файли з перейменування, не генеруючи нове ім'я, якщо файл потрібно виключити. Наприклад, наступна команда (за допомогою цієї конкретної rename
програми) переміщує всі файли, крім *.bak
від : /source
до /target
:
rename 's!/source!/target! unless m!\.bak$!' /source/*
За допомогою find
команди можна вибрати файли, які потрібно перемістити. Наприклад, наступна команда переміщує всі звичайні файли , за винятком того, *.bak
в /source
або підкаталозі в /target
(зверніть увагу , що структура каталогів зруйнувалася):
find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
або (ефективніше, якщо потрібно перемістити багато файлів)
find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
rsync
це узагальнення cp
та scp
з дуже потужними правилами включення / виключення. Наприклад, наступна команда копіює всі файли , за винятком *.bak
в /source
або підкаталог в /target
, поважаючи структуру каталогів:
rsync -a --exclude '*.bak' /source/ /target/
pax
є (серед іншого) іншим cp
на стероїди. Правила виключення не настільки потужні, як у rsync, але вони мають додаткову можливість перейменувати файли під час їх копіювання. Якщо ви перейменовуєте файл у порожній рядок, він виключається з копії. Наприклад, наступна команда копіює всі файли , за винятком *.bak
в /source
або підкаталог в /target
і перейменовує файли .bak
мимохідь.
cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
Наведений вище приклад має невдалий побічний ефект створення каталогів під назвою foo.bak
, яких можна уникнути, поєднуючи find
з pax
:
{ cd /source && find . -type f; } | \
pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
mv file1 file2 /path/to/destination
це не зробить те, що ви хочете, щоб це зробити