Предположим, у меня есть несколько файлов с таким именем:
file01.txt file02.txt file03.txt ... file20.txt
и я хочу выполнить команду для диапазона этих файлов.
Я знаю, что если я хочу «rm» из «file05.txt» в «file09.txt», я могу сделать:
rm file0[5-9].txt
но как я могу 'rm' диапазон от file08.txt до file13.txt? Я пробовал этот код
rm file[08-13].txt
и это не работает. Я мог бы запустить эту команду:
rm file0[89].txt file1[0-3].txt
но я хотел бы знать, смогу ли я сделать это только с одним уточненным аргументом 'rm', если это возможно.
Ответы:
Вам нужно использовать скобку расширения
bash
:Это удалит файлы
file08
вfile13
, покажет сообщение об ошибке, если какой-либо файл отсутствует.Установите диапазон, чтобы удовлетворить ваши потребности.
Проблема с оператором globbing
[]
заключается в том, что он обрабатывает каждый символ / цифру внутри него как один токен и поэтому поддерживает только объявление диапазона с использованием одной цифры.Если вы настаиваете на использовании
[]
, вы можете использовать это довольно уродливый рисунок в матчеfile08
сfile13
:источник
mv foo.{txt,md}
илиcp foo.txt{,.bak}
Некоторые оболочки, такие как Ubuntu по умолчанию
/bin/sh
(то естьdash
) илиmksh
не имеют расширения скобок, или в случаеksh
расширения скобок не могут использовать дополненные нули:В таких случаях мы можем использовать
printf
для форматирования числовой части имени файла и использовать цикл while для реализации c-like для поведения цикла (обратите внимание, чтобы заменитьecho
наrm
или как хотите):И это достаточно портативный - работает с
dash
,ksh
,mksh
, иbash
. В случаеksh
иbash
мы также можем использоватьc-style for loop syntax (but not in case of
mkshor
dash`):Обратите внимание, что в этом
bash
случаеprintf
поддерживается печать в переменную, и, следовательно, мы могли бы сделатьprintf -v num "%.2d" "$i"
вместо использования подстановки команд.источник