Как удалить пронумерованные файлы в заданном диапазоне?

Как удалить пронумерованные файлы в заданном диапазоне?

У меня есть folderA, в котором есть файлы с последовательностью номеров, начинающейся с a_000000. Я хочу удалить файлы, начинающиеся с определенного номера: скажем, a_000750до конца файлов в этом folderA. Может ли кто-нибудь подсказать, как это сделать с помощью скрипта оболочки?

решение1

Предполагая, что вы знаете или можете угадать конец диапазона, вы можете использоватьрасширения скобок:

rm a_{000750..000850}

Вышеуказанное удалит 101 файл между a_000750 и a_000850 включительно (и выдаст сообщение об именах файлов, ссылающихся на несуществующие файлы). Если у вас слишком много файлов для этого, используйте find:

find . -name 'a_*' | while read -r file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

Здесь findпросто перечисляются все файлы, соответствующие a_*. Список передается в whileцикл, где каждое имя файла считывается в переменную $file. Затем, используя bashманипуляция строкамиособенности, если числовая часть (find печатает файлы как ./file, поэтому ${file#./a_}печатает только число) равна 000750или больше, файл удален. -vПросто есть, чтобы вы могли увидеть, какие файлы были удалены.

Обратите внимание, что вышеприведенное предполагает разумные имена файлов. Если ваши имена могут содержать пробелы, переносы строк или другие странные символы, используйте это вместо этого:

find . -name 'a_*' -print0 | while IFS= read -rd '' file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

решение2

Вы можете сделать что-то вроде этого:

find . -regextype posix-extended -iregex './a_[0-9]{6}' -execdir bash -c '[[ ${1##./a_} > 000750 ]] && echo $1' "removing: " {} \;

Или:

find . -regextype posix-extended -iregex './a_[0-9]{6}' | sort | sed '0,/000750/d' | xargs echo

Первый метод предполагает фиксированный префикс, удаляет его и проверяет значение.

Второй метод предполагает наличие суффикса фиксированной длины (и общего фиксированного префикса) и опирается на этот факт; и хотя лексикографически он 201стоит перед , он не стоит перед .31031

Проверьте это с помощью echoкоманды, и как только вы убедитесь, что она выводит правильный список файлов, используйте rmвместо нее.

решение3

В Bash вы можете запустить:

for i in {1001..3000} ; do rm file_"$i".dat ; done

решение4

Так просто как

rm partialfilename* -f

В вашем примере это

rm a_00075* -f

Связанный контент