Есть ли способ mv
, cp
или любая операция файла таким образом, что я мог бы указать все файлы , которые я не хочу влияют?
Например, скажем , у меня есть папка с файлами file1
, file2
и file3
, и я хочу , чтобы двигаться file1
и file2
куда - то. Вместо того, чтобы явно называть файлы для перемещения ( mv file1 file2 /path/to/destination
), я хочу назвать файлы, чтобы они не перемещались, и чтобы все остальные в папке были перемещены ( mv --some-switch file3 /path/to/destination
)
command-line
rename
scp
скольжение
источник
источник
mv file1 file2 /path/to/destination
не будет делать то, что вы хотите, чтобы это сделатьОтветы:
Вы можете использовать расширенные шаблоны сглаживания в некоторых оболочках, чтобы соответствовать всем файлам в каталоге, кроме тех, которые соответствуют определенному шаблону. Например, в ksh, bash или zsh команда
переместит все файлы ,
/source
чтобы/destination
для сопоставления файлов , за исключением*.bak
. В zsh вы также можете писать,/source/^*.bak
если вы запускаете первый разsetopt extended_glob
, и в более общем случае (опять же требуетсяsetopt extended_glob
)/source/*~*.bak
(или/source/a*~*.bak
для всех файлов, чье имя начинается с,a
кроме.bak
файлов и т. Д.).У Zsh есть команда массового копирования / перемещения / ссылки, которую можно использовать, среди прочего, для перемещения всех файлов, кроме тех, которые соответствуют шаблону. Например, следующая команда перемещает все файлы , кроме
*.bak
от/source
кtarget
, и добавляет.bak
к их имени в процессе:Есть несколько команд, которые называются
rename
плавающими. В Debian и Ubuntu/usr/bin/rename
- это скрипт на perl, который перемещает файлы на новое имя, сгенерированное выражением perl. Вы можете исключить файлы из переименования, не создавая новое имя, если файл должен быть исключен. Например, команда следующего ( с помощью этой конкретнойrename
программы) перемещает все файлы , кроме*.bak
от/source
до/target
:Вы можете использовать
find
команду, чтобы выбрать файлы, которые вы хотите переместить. Например, следующая команда перемещает все обычные файлы , за исключением того,*.bak
в/source
или подкаталоге в/target
(обратите внимание , что структура каталогов разрушилась):или (более эффективно, если есть много файлов для перемещения)
rsync
Это обобщениеcp
иscp
очень мощные правила включения / исключения. Например, следующая команда копирует все файлы, кроме как*.bak
в/source
или подкаталог, в/target
соответствии со структурой каталогов:pax
это (среди прочего) другоеcp
на стероидах. Его правила исключения не так мощны, как rsync, но у него есть дополнительная возможность переименовывать файлы по мере их копирования. Если вы переименуете файл в пустую строку, он будет исключен из копии. Например, следующая команда копирует все файлы , за исключением*.bak
в/source
или подкаталог в/target
и переименовывает файлы.bak
мимоходом.Приведенный выше пример имеет неприятный побочный эффект создания вызванных каталогов
foo.bak
, чего можно избежать, комбинируяfind
сpax
:источник
find
команда должна заканчиваться\;
+
сразу после{}
.