- bash. удаление файлов по списку из файла.
- bash. удаление строк из файла по шаблону.
- Команды для удаления большого количества файлов в Linux
- Удаление старых файлов в Linux по Cron
- Linux, найти все файлы, соответствующие шаблону и удалить
- 4 ответа 4
- Удалить только файлы в каталоге на linux не каталоги
- 9 ответов
bash. удаление файлов по списку из файла.
интересует, каким образом можно удалить файлы имея их список в файле?
вариант с построчным чтением и выполнением rm не предлагать, он ацки долгий.
cat list | xargs rm -rv
А если my.txt четырёх гигов размером?
если список длинный, rm ругнется и не удалит.
ну.. список не будет более мегабайта, полагаю.
всем благодарен. вопрос закрыт.
О, знаток шелла? Попытка обойти граничные случаи?
Представь что публики нет, играть ни на кого не надо: будь честен хотя бы с самим собой и перечисли сам случаи, когда твой вариант не будет работать
Идеальный вариант в студию, будь добр
cat file | while read
А, ну да, пробелы не эксейпятся, если ты об этом
так это ты решил просвещением заняться, и про гигабайты начал страшилки рассказывать, я и не претендовал на универсальность
ТС не устраивает вариант с построчным чтением. А как известно клиент всегда прав
При достаточно большом списке это будет неизбежно. А так — да, получается дольше.
Кстати, в твоём случае пробелы тоже не ескейпятся, так что окромя этого я пока не вижу косяков.
А вообще я не понял, что ты от меня хочешь, покойся с миром.
в своё время, решал эту проблему простым копированием этого файла с редактированием строчек так, чтобы они превращались в параметры для rm, а затем весь файл запускал как скрипт
От тебя, и от остальных 6 миллиардов мне хотелось бы простого, но невыполнимого — адекватности.
Ты сам начал игру «А если. », я её поддержал, ты слился, т.е. я тебя сделал в твоей же собственной игре, ну куда это годится?
Я надеялся на выходе будет интересное красивое решение, а оказалась скукотища.
Больше с тобой не играем, и при встрече делаем вид, что мы не знакомы
Я от тебя конструктив то услышу? На косяк твоего $() тебе уже не только я указал
для 4гигабайт есть split -l
Не сдаёшься? Респект от Снупа
Для каждой задачи есть свой инструмент.
Не бывает универсальных инструментов, это ты и сам уже понял, и признал. Молодец.
Осталось научить тебя вежливости, и станешь на человека похож.
А твои аргументы из серии
«А знаешь какой у твоего туловища косяк?
У него всего две руки.
Было бы шесть — мог бы печатать в 3 раза быстрее» конечно умиляют, пойду твои остальные каменты почитаю повнимательнее
Смешно от тебя слышать что-то про адекватность, честно
Источник
bash. удаление строк из файла по шаблону.
создаю файл со списком всех файлов. после, нужно из этого файла создать другой с удаленными строками которые совпадают с шаблоном(ами) имени файла. как такое реализовать?
Если я правильно понял что требуется, то примерно так:
grep -v «pattern» source.txt > out.txt
нее, рыбята.. предполагалось, что есть какая-то утилита которая понимает файловые шаблоны.
т.е. чтоб вырезалась строка целиком, если содержимое в ней имя файла соответствует шаблону.
egrep -v ‘pattern’ file
все приведенные варианты именно так и работают.
в файле есть такая строка: /path/to/some/file.h
я хочу эту строку удалить. выполняю : grep -v «*.h» src.txt > dst.txt
но строка выводится в целевой файл.
У тебя неправильный регэксп, правильный будет:
grep -Ev «\.h$»
Кстати, все вышеприведённые варианты правильные.
спасибо. так работает.
а не подскажите, каким образом grep`у можно указать список шаблонов? т.е. как разделять? в общем Вы поняли)
ну как же они правильные, если я в точности так и выполняю, а результат не тот?
grep -Ev «\.(h|obj|cpp)$» например
потому что регекспы != wildcards
Ещё раз повторяю: у тебя неправильный регэксп.
Можно разделять регэкспы |, это будет OR; можно записать их в файл по одному на строку и вызывать grep -f patterns.txt file.txt.
В общем, man grep и man 7 regex.
спасибо еще раз :yes
позвольте еще такой вопрос.. список шаблонов игнорирования у меня в виде: «*.zip;*.h;*-suffix.7z». скажите, есть способ заставить grep использовать такую запись в качестве списка игнорирования? или придется этот список сначала обработать до нужного вида?
Делай действия по очереди. Будет меньше ошибок.
Источник
Команды для удаления большого количества файлов в Linux
Удаление старых файлов linux по маске чаще всего осуществляется следующим образом:
Веб-сервер указан для примера. Синтаксис очень прост — команда принудительно удалит все файлы с расширением .log в указанном каталоге, при этом удаление будет рекурсивным(-r — recursive) и подтверждения система при этом спрашивать не будет (-f — force).
При удалении таким образом очень большого количества файлов из определенного каталога может выдавать ошибки — причина в том, что система на самом деле не видит маски и разворачивает передаваемое ей выражение — срабатывает ограничение на количество аргументов, и выполнение команды прекращается.
Если rm -rf не помогает — удалять файлы следует в цикле for. Для каждого файла будет отдельная операция удаления и никаких ограничений системы здесь ожидать не приходится.
Синтаксис в простейшем случае может выглядеть так:
for f in /var/log/apache2/*.log; do rm «$f»; done
В цикл for можно добавить любую дополнительную логику.
Удаление старых файлов в Linux по Cron
Логи или другие файлы (сессии РНР) можно удалять как используя циклы (так приходится делать обычно если логов или других файлов накопилось действительно очень много), но если система не запущена или только создается лучше использовать регулярно выполняемое задание Cron, согласно которому с заданной периодичностью будут удаляться файлы определенных типов
# m h dom mon dow command
23 3 * * * find /var/www/web/sites/server-gu.ru/www/var/session/ -type f -mtime 7 -exec rm -f <> \;
В примере удаляются сессии РНР для сайта старше 7 дней.
В цикле то же самое можно сделать так:
for f in /tmp/logs/*.log
find $f -mtime +7 -exec rm <> \;
Приведенное выражение, как и любой другой цикл можно поместить в файл, сделать его исполняемым и с тем же успехом выполнять по Cron
Источник
Linux, найти все файлы, соответствующие шаблону и удалить
Нужно найти все файлы (рекурсивно), которые имеют подчеркивание в имени файла, а затем удалить их через командную строку.
4 ответа 4
Это самый безопасный и быстрый вариант:
Он не требует конвейерной обработки и не разрывается, если файлы содержат пробелы или символы-заглушки или что-то еще, что могут помешать другие конструкции. Самое простое правило, которое нужно помнить, это никогда не анализировать результаты find . И никогда не grep имена файлов, если вы хотите что-то с ними сделать позже. Вы можете сделать практически все что угодно с помощью функции find .
Это включает в себя каталоги, которые считаются файлами. Некоторые другие примеры, использующие xargs , потерпят неудачу, если имя файла содержит пробелы.
Если вы хотите только обычные файлы:
Хорошо, давайте делать это постепенно.
В качестве первого прохода это просто простое упражнение: передать подстановочный знак в команду find , не забывая процитировать его в кавычках и выполнить команду rm для каждого найденного файла:
Но, конечно, это ужасно неэффективно. Он запускает целый процесс rm для каждого отдельного файла. Поэтому, хотя мы могли бы сделать короткий обход \+ , это не то место, где мы собираемся в конечном итоге, поэтому давайте выберем более короткий путь и xargs чтобы объединить имена файлов в группы:
Но у этого есть две дыры в безопасности. Во-первых, если любое найденное имя файла начинается со знака минус, rm будет рассматривать его как параметр командной строки, а не как имя файла, и выдаст ошибку. (Версия -exec rm <> также имеет эту проблему.) Во-вторых, имена файлов, содержащие пробелы, не будут правильно обрабатываться xargs . Таким образом, дальнейшая итерация должна сделать это немного более пуленепробиваемым:
И, конечно же, есть интерактивные функции rm которые вам, вероятно, не нужны:
-print0 и -0 не являются стандартными, но GNU find и xargs , а также FreeBSD find и xargs понимают их. Однако даже это немыслимо. Нам не нужно создавать никаких дополнительных процессов вообще. GNU и FreeBSD find s оба могут вызвать unlink(2) системный вызов напрямую:
В качестве последней меры предосторожности, которая помешает вам делать больше, чем вы предполагали в определенных обстоятельствах, помните, что файловая система может содержать не только обычные файлы:
Источник
Удалить только файлы в каталоге на linux не каталоги
какую команду delete можно запустить, чтобы удалить только файлы в данном каталоге
- не директории
- не подкаталогов
- не файлы в этих поддиректориях.
некоторые файлы не имеют расширения, так rm *.* не будет работать.
в этой папке тысячи файлов.
9 ответов
можно использовать find С -type f только для файлов и -maxdepth 1 так find не будет искать файлы в подкаталогах /path/to/directory . rm -i предложит вам при каждом удалении, чтобы вы могли подтвердить или отклонить удаление. Если вы не заботитесь о подтверждении каждого удаления, измените его на rm -fv ( -f на силу удалить). The -v флаг делает это так, что с каждым удалением печатается сообщение о том, какой файл был просто удаленный.
это должно соответствовать критериям:
не директории
Не подкаталоги
Не файлы в этих подкаталогах.
но это не будет запрашивать подтверждение или выводить то, что он только что удалил. Поэтому лучше всего запустить его без действия-delete и проверить, что это правильные файлы.
так как это высоко на Google search, самый простой ответ:
где $directoryPath-это каталог, который вы хотите очистить. Кредиты должны идти на cbm3384 (который по какой-то причине получил отрицательные голоса за этот ответ, почему?)
если вы не хотите подтверждать:
если вы не верите, попробуйте man rm или
выше создает структуру каталогов, которая имеет helloX.файл txt в каждой папке (х уровень каталогов.) rm 1/2/* удалить hello2.txt и оставляет другую структуру неповрежденной.
и rm */*/* удаляет только hello2.txt . Это единственное, что соответствует шаблону.
просто пример файла Makefile, который очищает CakePHP tmp-directory и оставляет структуру каталогов нетронутой:
минус перед rm означает «не стой над ошибками» (каталог неснятую возвращает ошибку). Если вы хотите сохранить какой-то уровень, просто удалите эту строку, например, вторая строка rm удаляет журналы.
Дайте мне знать, если у вас есть система, которая делает что-то еще (БСД?).
EDIT: я тестировал это на ubuntu 12.04, osx lion и sourceforge.net Шелл. Все ведут себя так, как описано выше.
rm не удалять каталоги по умолчанию. Итак, в вашем примере,предполагая, что вы находитесь в Родительском каталоге и все файлы, все что вам нужно это:
Источник