Можно ли в одной команде удалить все файлы, которые соответствуют шаблону.
file_name_1294132_rest_of_file
rm \*(less than 1294132)\*
Можно ли в одной команде удалить все файлы, которые соответствуют шаблону.
file_name_1294132_rest_of_file
rm \*(less than 1294132)\*
В простейшем случае, когда у вас есть разумные имена файлов, которые не содержат странных символов, таких как новые строки, вы можете просто сделать:
rm "$(ls | gawk -F_ '$3<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
и т.д., пока ваша оболочка не пожаловалась на длину командной строки.
Еще один быстрый и грязный будет:
find . -name 'file_name_*_rest_of_file' | sort -n > /tmp/files.txt
отредактируйте файл file.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
$ {f//[^ 0-9]} является башизмом, и может быть сделано с
nn=${f#file_name_}
n=${nn%_rest_of_file}
или же
n=`echo $f | tr -C -d '[0-9]'`