У меня есть количество файлов с похожими именами с суффиксом от 1 до 500. Я хочу удалить только файлы от 1 до 250. есть ли способ сделать это с помощью подстановочного знака.
файлы: stdout.1 до stdout.500
Я хочу удалить файлы из stdout.1 до stdout.250.
Спасибо
В Zsh можно было сделать просто rm stdout.<1-250>
. <n-m>
соответствует частям имени файла, представляющим десятичное целое число от n до m . (Возможно, с ведущими нулями, так что stdout.0099
также будет соответствовать.)
В Bash вы можете использовать раскрытие фигурных скобок:rm stdout.{1..250}
. Хотя отличие от Zsh <1-250>
заключается в том, что раскрытие фигурных скобок генерирует строки без учета существующих файлов, поэтому вы можете получить ошибки, если файл отсутствует в середине списка. В случае rm
добавление опции -f
заглушит эти ошибки, как и в случае с -f
, rm
жалуется только в том случае, если какой-либо файл, который вы попросите отменить связь, все еще будет там после его возврата.
Если вы хотите избежать создания имен не -существующих файлов или ограничены стандартными sh
(, т. е. без расширения фигурных скобок ), вам придется выполнять сопоставление посимвольно. Так:
rm stdout.? stdout.?? # 1 to 99
rm stdout.1?? # 100 to 199
rm stdout.2[01234]? # 200 to 249
rm stdout.250 # 250
Однако обратите внимание, что если нет файла, соответствующего rm stdout.2[01234]?
, это приведет к удалению файла с именем stdout.2[1234]?
, если он существует.
Для этого можно использовать расширение фигурной скобки
rm stdout.{1..500}
Эта команда будет расширена до rm stdout.1 stdout.2... stdout.500
. Если какие-то из файлов не существуют, вы получите сообщение об ошибке, но вы можете спокойно его игнорировать. Кроме того, вы можете перенаправить stderr так, чтобы вы его не видели:
rm stdout.{1..500} 2>/dev/null
Или, но это будет значительно медленнее, вы можете перебрать файлы и запустить rm
на тех, которые существуют только:
for f in stdout.{1..500}; do
[ -e "$f" ] && rm "$f"
done
Вы также можете просто удалить все файлы, имя которых начинается с stdout.
и заканчивается одной или несколькими цифрами:
rm stdout.[0-9]*
Но это работает только в том случае, если у вас нет файлов, соответствующих шаблону, который вы хотите сохранить, поскольку он удалит все файлы, имя которых начинается с stdout.
, за которым следует любое число, поэтому также удалит файлы, такие как stdout.501
, которые не являются частью вашего диапазона.