Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Удалить на баше много файлов, зная только длинну их имён

#bash


В папке есть очень много файлов без префиксов и постфиксов. Файлы такого типа:

6854e37da3ad67a1bfa38a43bc3dea03
4e440d92372ad5a91f30dbff249f39d8
3eb560e2483c8959522da6209569405a
8a985608766a14b1a2dc91ce9928181c
pf35edf64f80276db31109da6da0cb78
g1b89cb11e3225ffada1cb5946902ec7


Удалять группами по маске какой-то вроде rm 6* — нельзя, т.к. в папке есть еще нужные
другие файлы которые могут таким образом удалиться.
Единственное что пока приходит на ум — удалять по длине, т.к. они все имеют одинаковое
количество символов в названии.
Если есть еще какие-то более умные варианты — буду благодарен.
    


Ответы

Ответ 1



есть такое понятие как маска. И что бы указать один символ имени, нужно указать знак вопроса. Поэтому, быстрое решение будет такое rm ???????????????????????????????? конечно, перед удалением лучше выполнить ls ????????????????????????????????

Ответ 2



помимо предложенного варианта с маской, состоящей из 32 символов ?, могу предложить следующее: очень похоже, что имена файлов содержат только шестнадцатиричные цифры — 0123456789abcdef (а символы p и g «затесались» в пример случайно). отобрать файлы с такими именами можно, например, так: $ ls | grep '^[0-9a-f]\{32\}$' | less в конце less — это для удобства просмотра, чтобы убедиться, что не попали в выборку файлы, которые не следует удалять. если «всё верно», реально удалить файлы можно, заменив в команде less на xargs rm. конечно, можно добавить и символы pg: $ ls | grep '^[0-9a-fpg]\{32\}$' | less или даже с уточнением: p или g могут быть только первым символом в имени (тогда надо 32 заменить на 31, чтобы сохранялась общая длина имени): $ ls | grep '^[pg][0-9a-f]\{31\}$' | less

Ответ 3



Удалять через ls плохая практика. ~$ find /path/to/dir -type f -regex ".{32}" -exec rm -rf {} \; ~$ find /path/to/dir -type f -regex ".{32}" -print0 | xargs -P$(nproc) -0 -n1 rm ".{32}" - имена с любыми символами в количестве 32 шт 2й вариант распараллелит в потоки - nproc это количество прцессоров в системе, что ускорит удаление если файлов больше 100кк . Правда, как заметили в коментарии, скорости удаления это не прибавит. Значительный прирост идет только от использовния xargs вместо ключа -exec

Ответ 4



Вот так можно: (+ в питоне можно задавать очень сложные условия без проблем) for filename in $(find *.* | python3 -c "while True: line = input(); print(line) if len(line) == LEN_STRING else None");do rm ${filename}; done

Комментариев нет:

Отправить комментарий