У меня есть 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
стоит перед , он не стоит перед .31
031
Проверьте это с помощью echo
команды, и как только вы убедитесь, что она выводит правильный список файлов, используйте rm
вместо нее.
решение3
В Bash вы можете запустить:
for i in {1001..3000} ; do rm file_"$i".dat ; done
решение4
Так просто как
rm partialfilename* -f
В вашем примере это
rm a_00075* -f