Можно ли в одной команде удалить все файлы, которые соответствуют шаблону.

file_name_1294132_rest_of_file

rm \*(less than 1294132)\*

3 ответа3

2

В простейшем случае, когда у вас есть разумные имена файлов, которые не содержат странных символов, таких как новые строки, вы можете просто сделать:

rm "$(ls | gawk -F_ '$3<1294132')"

Существуют различные причины, по которым вы должны избегать парсинга ls , поэтому вот способ обойти это:

for f in file_*; do 
   printf %s "$f" | perl -anF_ -e 'unlink() if $F[2]<1294132'; 
done
1

Я предполагаю UNIX/Linux из-за команды "rm".

Все ли файлы в одном каталоге? Если нет, то это сильно усложняет ситуацию.

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

Это будет работать, хотя будет медленно:

seq 1 1294131 | xargs -i{} echo rm file_name_{}_rest_of_file

(конечно, уберите эхо, когда вы захотите запустить реальный rm) Чтобы ускорить процесс, я бы сделал пометку на файлах, которые не нуждаются в сравнении:

rm file_name_[1-9]_rest_of_file
rm file_name_[1-9][0-9]_rest_of_file
rm file_name_[1-9][0-9][0-9]_rest_of_file
rm file_name_[1-9][0-9][0-9][0-9]_rest_of_file

и т.д., пока ваша оболочка не пожаловалась на длину командной строки.

Еще один быстрый и грязный будет:

find . -name 'file_name_*_rest_of_file' | sort -n > /tmp/files.txt

отредактируйте файл file.txt, чтобы удалить файлы, которые не следует удалять

< /tmp/files/txt xargs rm

Вы также можете написать скрипт, который разбивает имя файла на компоненты, извлекает "count", выполняет сравнение, а затем удаляет или передает файл. Но это, вероятно, займет больше времени, чем любой из вышеперечисленных.

1

Вы можете поместить все это в одну строку (с '; s) и вызвать это одной командой

for f in file_name_*_rest_of_file
do 
   n=${f//[^0-9]}
  if [[ -n $n && $n -lt 22 ]]
  then
    echo del $f
  fi
done

Это немного долго

for f in file_name_*_rest_of_file;do; n=${f//[^0-9]}; if [[ -n $n && $n -lt 22 ]]; then echo del $f; fi;done

$ {f//[^ 0-9]} является башизмом, и может быть сделано с

nn=${f#file_name_}
n=${nn%_rest_of_file}

или же

n=`echo $f | tr -C -d '[0-9]'`

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .