Как к 'комнате' или 'mv' диапазон файлов, таких как file01.txt, file02.txt…file85.txt

Предположим, что у меня есть набор файлов, названных этим путем:

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

но я хотел бы знать, могу ли я сделать это только с еще одним усовершенствованным аргументом 'комнате', если это возможно.

22
задан 7 August 2016 в 08:21

2 ответа

Необходимо использовать расширение фигурной скобки bash:

rm file{08..13}.txt

Это удалит файлы file08 к file13, покажет сообщение об ошибке, если какой-либо файл будет отсутствовать.

Набор диапазон для удовлетворения потребностей.

<час>

проблема с globbing оператором [] состоит в том, что он рассматривает каждый символ/цифру в нем как единственный маркер и поэтому только поддерживает объявление диапазона с помощью единственных цифр.

, Если Вы настаиваете на том, чтобы использовать [], можно использовать этот довольно ужасный шаблон для соответствия file08 к file13:

rm file0[8-9].txt file1[0-3].txt
37
ответ дан 23 November 2019 в 01:33

Некоторые оболочки, такие как значение по умолчанию 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 ofmkshorподчеркните штриховой линией'):

$ 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" вместо того, чтобы использовать замену команды.

2
ответ дан 23 November 2019 в 01:33

Другие вопросы по тегам:

Похожие вопросы: