#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
Комментариев нет:
Отправить комментарий