Использование подстановочного знака для удаления файлов с похожими именами с многозначным суффиксом

У меня есть количество файлов с похожими именами с суффиксом от 1 до 500. Я хочу удалить только файлы от 1 до 250. есть ли способ сделать это с помощью подстановочного знака.

файлы: stdout.1 до stdout.500

Я хочу удалить файлы из stdout.1 до stdout.250.

Спасибо

1
22.06.2020, 10:41
2 ответа

В 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]?, если он существует.

8
18.03.2021, 23:25

Для этого можно использовать расширение фигурной скобки

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, которые не являются частью вашего диапазона.

3
18.03.2021, 23:25

Теги

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