Предположим, что у меня есть набор файлов, названных этим путем:
file01.txt file02.txt file03.txt ... file20.txt
и я хочу выполнить команду на диапазоне этих файлов.
Я знаю, хотят ли к 'комнате' от 'file05.txt' до 'file09.txt', я могу сделать:
rm file0[5-9].txt
но как может я 'комната' диапазон от file08.txt до file13.txt? Я попробовал этот код
rm file[08-13].txt
и это не работает. Я мог выполнить эту команду:
rm file0[89].txt file1[0-3].txt
но я хотел бы знать, могу ли я сделать это только с еще одним усовершенствованным аргументом 'комнате', если это возможно.
Необходимо использовать расширение фигурной скобки bash
:
rm file{08..13}.txt
Это удалит файлы file08
к file13
, покажет сообщение об ошибке, если какой-либо файл будет отсутствовать.
Набор диапазон для удовлетворения потребностей.
<час> проблема с globbing оператором []
состоит в том, что он рассматривает каждый символ/цифру в нем как единственный маркер и поэтому только поддерживает объявление диапазона с помощью единственных цифр.
, Если Вы настаиваете на том, чтобы использовать []
, можно использовать этот довольно ужасный шаблон для соответствия file08
к file13
:
rm file0[8-9].txt file1[0-3].txt
Некоторые оболочки, такие как значение по умолчанию Ubuntu /bin/sh
(который является dash
) или mksh
не имейте расширения фигурной скобки, или в случае ksh
- расширение фигурной скобки не может использовать дополненный, обнуляет:
$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13
В таких случаях мы можем использовать printf
отформатировать часть числа имени файла и использование некоторое время цикл для реализации подобный c для поведения цикла (примечание для замены echo
с rm
или независимо от того, что Вы хотите):
$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt
И это довольно портативно - работает с dash
, ksh
, mksh
, также bash
. В случае ksh
и bash
мы можем также использовать c-style for loop syntax (but not in case of
mkshor
подчеркните штриховой линией'):
$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt
Отметьте это в bash
случай, printf
печать поддержек к переменной, и таким образом мы могли сделать printf -v num "%.2d" "$i"
вместо того, чтобы использовать замену команды.