Команды для удаления большого количества файлов в 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, согласно которому с заданной периодичностью будут удаляться файлы определенных типов
>>доброго дня, >> >>подскажите как с помощью rm удалить все файлы с расширением *.txt ? >> >>заранее спасибо. > >find /home/vasya -name «*.txt» | xargs rm
Можно обойтись одним find find path -type f -name «*.txt» -delete > >rm *.txt, rm -r *.txt > >В зависимости от контретной ситуации
Источник
Удаление всех файлов определённого типа в каталоге
Есть каталог rare, в нём — куча подкаталогов и файлов. Нужно удалить все .m3u файлы. Делаю:
однако эта команда оставляет .m3u файлы, если в путях есть пробелы. Как заставить её обрабатывать пробелы?
Добавить двойные кавычки
Отличный совет, чувак. Я сейчас удалил половину каталога с музыкой.
Тогда экранированные двойные кавычки.
«Чуваком» будешь отца своего звать, а я тебе ответил на вопрос касательно классического метода, что решает эту задачу. Не зря я написал именно так, как написал.
Ууу, кто-то только что спалил виртуала
Как такое могло получиться? Вы же не скопипастили «find -delete»?
/Music -type f -name «.txt» -delete в моем случае просто удалило все .txt файлы. С чего у вас удалилась музыка, если вы удаляете .m3u только?
Update: Не нужно никаких костылей вроде xargs, find умеет удалять файлы с параметром -delete. Но для начала без него, проверьте, чтобы find искал все необходимые файлы, а потом уже дописывайте -delete, чтобы их удалить.
Источник
eye_ru
Программер-наблюдатель
Казалось бы, простая задачка. В Windows все просто — del /S smth.*, готово. Все файлы по маске smth.* в текущей директории и ниже будут удалены.
В Linux чуток сложнее. Есть в Linux команда rm, но она дальше текущей директории не идет, зато прекрасно понимает полный путь к файлу, чем мы и воспользуемся. Получить список всех файлов в текущей директории и поддиректориях по маске позволяет команда find -name «smth.*», ее вывод то нам и нужен. Осталось его перенаправить на вход команды rm. Это можно сделать 5ю способами: xargs — формирует команду rm с аргументами считанными из стандартного ввода на которой мы подадим вывод команды find. нюансы использования описаны тут 1. find /path/to/dir -type f -name ‘smth*’ -print0 | xargs -0 rm; exec — перенапаравляем вывод команды find на вход команды rm 2. find -name ‘smth.*’ -exec rm <> \; UPD. find — самый рульный способ 3. find -name ‘smth.*’ -delete; UPD. Способы подсказанные камрадом goodvin 4. find . -type f -name ‘smth*’ -delete 5. find . -type f -name ‘smth’ -exec rm -f — «<>» \;
Может есть ещё какие нибудь способы??
Жестоко
Re: Жестоко
> Может есть ещё какие нибудь способы?
См. -delete в `man find`.
что значит не работает?
права то на удаление есть?
какую ошибку пишет?
/test$ ls -R .: smth.123 smth.1231 smth.12311 -smth sd.1231 smth sd.1231 test
У нас в конторе один из любимейших вопросов на собеседовании: как удалить сто тыщ мильонов файлов с заранее неизвестными названиями в одной директории? Ответы типа «rm -f /path/to/dir/*» не подходят, поскольку звездочка преобразовывается в список файлов, удовлетворяющих wildmat’у (в данном случае — все файлы), а у шелла есть ограничение на размер командной строки. Тот же результат будет у «find /path/to/dir -type f| xargs rm», поскольку, во-первых xargs преобразует весь stdin в одну строку (try: «find /tmp |xargs echo rm»), во-вторых, в именах файлов могут содержаться пробелы, которые не эскейпятся, в-третьих, названия файлов могут начинаться на -, из-за чего rm воспримет имя файла как неизвестную опцию и упадет. Ну и ограничение на длину команды никто не отменял. Первые три проблемы обходятся так: find /path/to/dir -type f -print0 |xargs -0 rm — Опция -print0 какбэ говорит команде find, что в качестве разделителей нужно использовать нулевой символ вместо перевода строки, а -0 указывает xargs, что разделитель — не пробел, а все тот же нулевой символ.
Поэтому правильным ответом считается команда find . -type f -name ‘smth*’ -delete или find . -type f -name ‘smth’ -exec rm -f — «<>» \;
Ну или простенький цикл: for f in «`find . -type f -name ‘smth*’`» ; do rm «$f»; done по количеству кавычек в котором можно еще и определить степень знания особенностей использования шелла 🙂
Спасибо!
Re: Спасибо!
И, наконец, вот команда, которая будет выполнена для каждого файла:
-exec ln <> /var/www/obsolete \;
Здесь вы также должны дезактивировать знак ;, в противном случае командный процессор интерпретирует его как разделитель команд. Если вы забудете сделать это, find пожалуется, что для -exec отсутствует аргумент.
xargs xargs xargs
Спасибо за пост, узнал про xargs. Все ж намного проще:
find . -name .svn|xargs rm -rf
(удаление папки .svn во всех подпапках проекта)
Источник
Удаление файлов по маске с фтп
Есть доступ к фтп-директории на чтение, запись, удаление. В крон запихиваю скрипт, который будет забирать оттуда файлы по маске, и по той же маске их удалять, дабы каждый раз не забирать одно и тоже.
Что Я Делаю Не Так?
О, теперь на ЛОРе можно говорить «руки из Zhopin »
У тебя руки из Zhopin
если руки золотые, не важно откуда они растут
Ты всё перепутал, это не золото. Это просто говно такого цвета.
кроме анонимного ослоумия, посты будут? Полезные посты я имею ввиду
Страшная поделка. IMHO удалять можно только то, что скачали.
На перле или другом языке это более просто и надежно.
Чем не устроил обычный ftp клиент ? Нафига этот pftp ?
дебаг у pftp есть. Включить да посмотреть. Может нужно отключить интеракив в явном виде? pftp -i . ?
Может на получении остальные команды игнорятся? Попробуй через скрипт отправить:
У тебя руки из Zhopin
[quoteЧто Я Делаю Не Так?
У тебя руки из Zhopin
У тебя руки из Zhopin
я и удаляю то что скачиваю. ftp -p = pftp — всё это обычный фтп клиент страшная поделка взятая из 99,99% примеров использования фтп клиента в баш, использовал материал которым располагал, не более. Что бы сделать это на перле наверно нужно знать перл, не?
спасибо за пример, решением стало sleep в 200 миллисекунд между скачиванием и удалением. И теперь я знаю как более красиво использовать код в баше, ещё раз моя благодарность.
Достаточно взять готовые примеры и подправить
Если ты знаешь bash, то понять не сложно.
Вот ещё подобная тема недавно поднималась.
Ну и да — вариант с задержкой я для проверки привёл. Ты не можешь быть уверен, что она всегда сработает. Раз сервер игнорит команды он будет делать это и дальше.
В смысле ты подобрал задержку исходя из скорости передачи определённого объёма данных.
Это случайные величины. Нельзя так делать. Нужно более надёжное решение.
проблема в том что я не знаю баш, а только только учу его. Кинусь на другое, хорошего ничего не выйдет. Но я учту ваш совет на будущее, спасибо.
ziemin , это я понимаю, просто эта вся шняга была чисто в образовательных целях. +владелец фтп-сервера говорил что при скачивании файла, удалении (т.е. при определённых действиях), запускается некий скрипт (причём при помощи какого то модуля для фтп сервера — modexec вроде бы), который что то там делает. Что происходит по ту сторону, загадка, но возможно, этому и требуется 200 мс, так как с этой задержкой удачно скачивались, а затем удалялись, десятки файлов больших объёмов.
В крон запихиваю скрипт, который будет забирать оттуда файлы по маске, и по той же маске их удалять, дабы каждый раз не забирать одно и тоже.
не знаешь и не желаешь знать про OpenSSH и rsync
поподробней пожалуйста, я неофит и не не очевидна мне ваша мысль первое тулзы для соединения и передачи файлов по ssh второе синхронизация двух папок на двух юникс машинах как мне это поможет при работе с фтп?
FTP протокол сам по себе очень старый, и его лучше не использовать. Лучше используйте ssh, он намного более надёжный, удобный, и безопасный.
rsync решит ваши проблемы одной командой без всяких нелепых костылей и задержек. И даже более того: она умеет качать только то, что действительно необходимо скачать, а не всё подряд. Естественно она НЕ работает по FTP.
Поинтересуйтесь у администратора сервера, возможно ssh там уже есть(в 146% это так).
действительно, погуглив, ssh практически полноценная замена ftp. Просто опять же человеческий фактор, просить администратора что то поменять просто так на его хорошо работающем сервере — сложная задача. Поэтому и скачу из имеющихся возможностей
Просто опять же человеческий фактор, просить администратора что то поменять просто так на его хорошо работающем сервере — сложная задача.
обычная практика: держать SSH для себя, и FTP для клиентов. Потому что 95% клиентов FTP достаточно. Ну потому доступ по SSH по умолчанию либо закрыт, либо открыт, но о нём вам не рассказали. Просто надо пообщаться с администратором, обычно SSH доступ дают без проблем.
ssh практически полноценная замена ftp.
нет. Ssh это намного больше, чем «заменитель ftp». И беглое гугленье вам не поможет, там Over9000 возможностей, потому вы скорее вссего наткнулись не совсем на то, что вам нужно. Наверное на sftp. Это конечно годно, но это только один из вариантов.
для вашего случая ИМХО оптимально rsync over ssh, если конечно на сервере есть rsync(если нет, то rsync тоже можно, но sftp в этом случае не хуже).
понял, просто для админа сервера я «немного продвинутый клиент», поэтому ssh мне точно не светит. Но спасибо, уже копаю в этом направлении, ваш пост оказался мегаполезен.
для админа сервера я «немного продвинутый клиент»
учитывая, что 95% клиентов _полные_ _идиоты_, а оставшиеся 5% — суперхакеры с ЧСВ Over9000, то такой клиент как вы — просто счастье ☺