можно ли в одной команде удалить все файлы, соответствующие шаблону.
file_name_1294132_rest_of_file
rm *(less than 1294132)*
можно ли в одной команде удалить все файлы, соответствующие шаблону.
file_name_1294132_rest_of_file
rm *(less than 1294132)*
В простейшем случае, когда у вас есть здравомыслящие имена файлов, которые не содержат странных символов, таких как новые строки, вы можете просто сделать:
rm "$(ls | gawk -F_ '<1294132')"
здесь разным причинам почему стоит избегать парсинга ls
, Так вот способ обойти это:
for f in file_*; do
printf %s "$f" | perl -anF_ -e 'unlink() if $F[2]<1294132';
done
Я предполагаю 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", делает сравнение, а затем либо удаляет, либо передает файл. Но это, вероятно, займет больше, чем любой из вышеперечисленных.
вы можете поместить все это в одну строку (с '; ' 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]'`
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]