Есть ли способ удалить все файлы меньше x

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

file_name_1294132_rest_of_file

rm *(less than 1294132)*
16
задан terdon
11.02.2023 9:26 Количество просмотров материала 2951
Распечатать страницу

3 ответа

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

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

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

for f in file_*; do 
   printf %s "$f" | perl -anF_ -e 'unlink() if $F[2]<1294132'; 
done
2
отвечен terdon 2023-02-12 17:14

Я предполагаю 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

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

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

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

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

< /tmp/files/txt xargs rm

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

1
отвечен Rich Homolka 2023-02-12 19:31

вы можете поместить все это в одну строку (с '; ' 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

${Ф//[^0-9]} является bashism, и может быть сделано с помощью

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

или

n=`echo $f | tr -C -d '[0-9]'`
1
отвечен 9mjb 2023-02-12 21:48

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх