Вы можете использовать расширенные шаблоны сглаживания в некоторых оболочках, чтобы соответствовать всем файлам в каталоге, кроме тех, которые соответствуют определенному шаблону. Например, в 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
не будет делать то, что вы хотите, чтобы это сделать