Удаление определенных файлов в командной строке

8

У меня есть файлы fileName_1 , fileName_2 ... fileName_100000, где fileNames нумеруются последовательно. Как я могу удалить файлы с индексом, превышающим, скажем, 100 ?

teaLeef
источник

Ответы:

17

Если имена файлов пронумерованы последовательно, просто выполните следующую команду:

rm fileName_{100..100000}
cioby23
источник
3
Информация: Это работает, потому что bash (ваша оболочка) расширит {x..y}весь список. Например, если вы используете echo test{1..3}его, он будет расширен echo test1 test2 test3и затем выполнен. Как видите, он печатает test1 test2 test3. Точно так же, если {x..y}он не связан с каким-либо аргументом, он просто поместит туда цифры. Например echo test {1..3}, просто распечатать test 1 2 3.
Люк
1
Примечание: есть ограничение, налагаемое execвызовом на число аргументов, которые может иметь процесс. Вы можете получить его с помощью getconf ARG_MAX. Например, в моей системе это 2097152(~ 2,1 миллиона). Это означает, что rm(который не является встроенным) потерпит неудачу с большим количеством файлов. Встроенные команды не имеют этой проблемы, как и другие предложенные решения.
Бакуриу
Обратите внимание, что ARG_MAX - это количество байтов, а не количество аргументов. rm не может обработать удаление 2097152 файлов одновременно. Он может удалить 2048 файлов, каждое из которых имеет имя длиной 1023 байта (не 1024; разделители между аргументами (\ 0 в C-land) учитываются в пределе).
Godlygeek
6

Вы можете попробовать эту команду также,

for i in $(seq 100 100000); do rm fileName_$i; done

Он удалит все файлы (в диапазоне от 100 до 100000), если имя файла содержит числа в последовательном порядке.

Авинаш Радж
источник
5

В общем, у вас есть несколько способов добиться этого:

rm fileName_{100..100000}

будет расширен оболочкой примерно до 100 000 имен файлов. Если базовое имя представляет собой длинный путь и число достаточно велико, вы можете фактически превысить максимальную длину командной строки при таком подходе.

forцикл

for i in $(seq 100 100000); do rm fileName_$i; done

не страдает от этой проблемы, но является относительно медленным способом удаления файлов, поскольку оболочка должна выполнить подстановку переменной и запустить rm около 100 000 раз.

Оба метода выше могут вызвать предупреждения, если некоторые файлы, скажем, filename_101отсутствуют.

Как правило, решения, основанные на findних, лучше, так как они работают только с файлами, которые на самом деле существуют (во время обнаружения). Тем не менее, есть некоторые тонкие различия:

find . -name 'fileName_[100-100000]' -exec rm {} \;

будет по- прежнему запустить rmпрограмму около 100000 раз, заменяя окончательную \;В +будет пытаться минимизировать количество подпроцессов. Оба метода, вероятно, будут (намного или чуть) медленнее, чем те, -deleteкоторые вообще не используют внешние команды, а вместо этого вызывают системные вызовы.

Тем не менее, всегда сначала проверяйте, соответствует ли шаблон файлам, на которые вы хотите нацелиться:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

Таким образом, в этом случае вы удалили файл, который хотели сохранить, и оставили файлы, которые должны были быть удалены.

Штефан Шмидль
источник
4

Используйте следующую команду:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Это приведет к удалению файлов от 100 до 100000.

Больше информации: Сайт

Nux
источник
Тебе лучше использовать, +а не \;- смотреть здесь . Или, что еще лучше, используйте -deleteкоманду find .
evilsoup
Я проверил это, и он только удалил имя_файла_1. Класс [100-100000] символов соответствует только одному символу, поэтому он может соответствовать только 0 или 1.
deltab