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

предыдущий пост

Как удалить файлы в разных папках через терминал?

Например

Это от junkImg-5.png до junkImg-60.png , что означает наличие junkImg-30 , junkImg-45 ... и т.д.

Есть ли быстрая команда, чтобы удалить их в командной строке?

я пытался

find /project/test/ -name 'junkImg-5*' -exec rm -f {} \ ;

но это слишком медленно, и у меня так много изображений. Есть ли способ, которым linux может указать диапазон? Большое спасибо!

3 ответа3

6

Просто используйте расширение скобки, чтобы удалить диапазон файлов:

rm /project/test/junkImg-{5..60}.png

Это удалит файлы junkImg 5 - 60, только с одним процессом rm . Вы также можете сначала заменить команду rm на ls чтобы убедиться, что она выбирает нужные файлы, а затем снова заменить ее на rm .

2

Find использует Shell Pattern Matching для предиката -name , поэтому вы можете использовать предикат -or и эти шаблоны:

find DIRECTORY -name 'junkImg-[5-9].png' -or -name 'junkImg-[1-6]?.png' -delete

Вы также можете исключить первые четыре файла, используя предикат -not :

find DIRECTORY -name 'junkImg-*.png' -not -name 'junkImg-[1-4].png' -delete

Чтобы проверить правильность работы команд, всегда запускайте их без -delete в первую очередь. Это перечислит файлы вместо того, чтобы удалить их.

1

Вы запускаете новую команду rm для каждого удаления. Это не самый быстрый способ. Это нужно сделать только в том случае, если у вас есть столько файлов, что вы не можете перечислить их все за один раз.

Чтобы сделать вещи быстрее, либо:

  1. измените -exec rm с -ls и передайте его через xargs. Добавьте -print0, если вы ожидаете, что некоторые имена файлов будут трудными (например, с пробелом в них).
  2. Или лучше использовать find build в -delete .

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