Удаление файлов по расширению linux
подскажите как с помощью rm удалить все файлы с расширением *.txt ?
заранее спасибо.
Оглавление |
|
Сообщения по теме | [Сортировка по времени | RSS] |
1. «Удалить файлы по маске *.txt» | + / – | |
Сообщение от chainik (??) on 13-Мрт-09, 11:49 | ||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
2. «Удалить файлы по маске *.txt» | + / – | |
Сообщение от djaarf (??) on 13-Мрт-09, 14:28 | ||
Чудесная утилита find тебе поможет. | ||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
3. «Удалить файлы по маске *.txt» | + / – | |
Сообщение от Veon (??) on 13-Мрт-09, 16:52 | ||
find /home/vasya -name «*.txt» | xargs rm rm *.txt, rm -r *.txt В зависимости от контретной ситуации | ||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
5. «Удалить файлы по маске *.txt» | + / – | |
Сообщение от djaarf (??) on 13-Мрт-09, 21:19 | ||
Можно обойтись одним find Источник Удалить файлы с определённым расширением. Как?Как удалить файлы с определённым расширением? Что нужно: удаление файлов с определённым расширением из директории /home. В /home может быть множество различных папок. Файлов с разными расширениями может быть много. Разве в find в «одну строку» можно уложиться? куча вариантов 1) на питоне напиши, расширения в кортеж, потом с помощью endswith() проверяешь файлы 2) на баше напиши 3) тупо возьми find find ./ -type f \( -iname \*.txt -o -iname \*.iso \) find -iregex ‘.*\.\(txt\|html\|iso\)$’ -exec позволяет выполнить команду, подставив найденное имя. ‘<>‘ — найденное имя, экранированная точка с запятой — конец блока -exec. Добавил решения в первый пост. Как создать переменную для указания расширений? Иначе получится колхоз. у линуксового find есть сразу опция -delete -exec универсальный 🙂 А вникать в этот ман нужно очень долго.
Забудь про расширения. Это вендузячий подход. В линуксах просто имя файла. Если точка в начале, то некоторые утилиты считают его скрытым. А раз имя файла, то к нему можно применять регулярки. Например rm *bak тип регулярки можно задать через -regextype, список типов получить запустив ‘find -regextype help’, но само их описание погребено в недрах info.
bash таки умеет массивы. Если позанудствовать, то ТСа можно понять так, что каталоги с именами типа a.txt/ удалять наверное не надо. 🙂
. -type f . А, точно, спать надо больше 🙁 Как же так. Наверное прокоментировать хотел пример выше, а взял последнее. А что, rm -r *.*ext* не катит уже? 1) нерекурсивный Такой вариант ещё предложили, ну очень удобный.
Это небезопасное извращение. Если подствить в list «расширения» тоже в виде масок, то вместо передачи для поиска этих масок будут искаться файлы с именами удовлетворяющие этой маске: Может выдать типа: колхоз, но с утра голова лучше не придумала) Заодно пометь тему решенной
У вас таже самая ошибка. Уж сколько раз твердили миру, что есть специально придуманный синтаксис «$», с кавычками, прямо отдельной строкой в документации. эм, давно не баше не писал, пардноньте, а то, что я поставил точку перед расширением не поможет?
Нет, потому что маска развернется ещё в for i in *?[xyz]* ★★★★★ ( 14.09.17 11:41:35 ) хм, спасибо, буду знать. Так в итоге, какое конечное решение будет на баше? Чтобы я протестировал и обновил первый пост. Так вроде же понятно объяснил, надо записать «$ С переменными и, особенно, массивами в bash лучше не связывайся, с ними всегда больше ошибок и тормозов, типичный пример тут Удалить файлы с определённым расширением. Как? (комментарий)
Смешно. Просто эталонно-гранитное «неасилил». Я осилил. И понял, что, во-первых, оно того не стоит и почти везде лучше итерацию по пассиву заменять на пайпы, xargs и т.п. и во-вторых, новичок точно напорется на грабли с файликами с пробелами, начинающимися на минус, с длиной командной строки и т.п.
Это просто бла-бла. Чтобы не выглядеть так как и вы голословным, то «всегда» на самом деле означает «там, где нет bash», что мало похоже на топик с таким тегом. И этот поц говорит о тормозах и пробелах в именах. Обновил первый пост. Добавил скрипт на баше. Пожалуй его и буду использовать. Наиболее компактный вариант для меня, с учётом того, что выражений десятки.
Вариант с итерацией по башевскому массиву проходит дерево столько раз, сколько ищется расширений — это может быть и 10 и 20 раз. Многократное замедление прохода по диску — это не голые слова, а суровая реальность. А через год ТС захочет решить те-же задачу тем-же способом, но забудет кавычки или поставит не те и будет удивляться, почему простой скрипт глючит.
Это вроде бы правильно, но в скриптах важно не задумыватся о работе внутри дерева интерпретатора, а их удобность. Так вот, поиск и правка хардкорного regex-а внутри скрипта у вас займёт кучу времени по сравнению со сколько комп затратит на цикл. Хотя. если действительно считать миллисекунды, то да, надо формировать аргументы (-a -name «.$ext»)* для ровно одного вызова find. Можно было б вам защитать 1:1, но вызов несколько find-ов это на много затратнее чем дерево bash-а и потому объяснение правильно лишь случайно :))) А скрипт становится развесистым и трудным для понимания.
Ну на это я уже отвечал, это эталонное «ниасилил.» А я понял, вы не о внутренностях интерпретатора. Проход по файловой системе действительно долог. Разве что надеяться, что система обычно тут не очень тупит и в кеш попадает всё на первом проходе, так как файлы сами не читаются и память уходит только на сами каталоги. Признаю, думал о людях обычно глубже и сразу бросился отвечать. Но даже первый абзац остаётся в силе насчёт неудобств харкоженного и неудобного regex.
Да ещё как. Если это зрелая файлопомойка на терабайт, то огого как долго можно по ней блуждать. А если оно по сети смонтировано, то всё ещё хуже. А если поиск идёт не по имени, а, например, по дате, то это вызов stat() на каждый файл. Хотя на моём хомяке кеширование здорово помогает и разница не настолько велика, как я ожидал. Трудночитаемость регэкспов признаю и вообще хотел бы, чтобы у find была опция -names-from-file (так-же, как grep —file=). скостылить для финда чтение паттернов из файла можно, но выглядит это ужасно. Источник Как удалить файл через терминал LinuxЭта небольшая заметка ориентирована на совсем начинающих. Сегодня мы рассмотрим как удалить файл linux через терминал. Для более опытных пользователей это элементарная задача, но новичкам надо с чего-то начинать. Знать как работать с файлами в консоли очень важно. К тому же удаление из консоли дает много преимуществ и большую гибкость. Например, с помощью специальной команды вы можете полностью стереть файл с жесткого диска, так что его уже ни за что невозможно будет восстановить или одной командой с помощью специальных символов, условий или регулярных выражений удалить сотни ненужных файлов в одном каталоге или подкаталогох соответствующих определенному критерию. В Linux для удаления файлов предусмотрена стандартная утилита rm. Как и все остальные, стандартные утилиты в имени rm тоже заложена определенная идея. Это сокращение от английского слова Remove. Удаление файлов в LinuxЧтобы удалить файл linux достаточно передать в параметрах команде адрес файла в файловой системе: Чтобы удалить все файлы, начинающиеся на слово file можно использовать специальный символ *, означает любой символ в любом количестве: Эта команда удаления файла в linux должна использоваться очень осторожно, чтобы не удалить ничего лишнего. В утилите есть опция -i, которая заставляет программу спрашивать пользователя перед тем, как удалить файл linux: rm: удалить пустой обычный файл «/home/user/file»? Если файлов очень много, вы уверены в правильности команды и отвечать каждый раз y неудобно, есть противоположная опция — f. Будут удалены все файлы без вопросов: rm -f /home/user/file* Для удаления директорий, вместе с файлами и поддиректориями используется опция -R, например: rm -Rf /home/user/dir Будет удалено все что находиться в папке dir, и эта папка. Только будьте бдительны, чтобы не получился знаменитый патч Бармина: Не стоит выполнять эту команду в своей системе, как видите, она удаляет все файлы в файловой системе Linux. Удаление файла в linux также возможно с помощью утилиты find. Общий синтаксис find: find папка критерий действие Например, мы хотим удалить файл linux по имени: find . -type f -name «file» -exec rm -f <> \; Будут найдены все файлы с именем file в текущей папке и для них вызвана команда rm -f. Можно не вызывать стороннюю утилиту, а использовать действие delete: find . -type f -name «file» -delete Удалить все файлы в текущей директории, соответствующие определенному регулярному выражению: find . -regex ‘\./[a-f0-9\-]\.bak’ — delete Или удалить файлы старше определенного строка, может быть полезно для удаления старых логов: find /path/to/files* -mtime +5 -exec rm <> \; Будет выполнено удаление файлов через терминал все файлы в папке старше 5-ти дней. Чтобы полностью стереть файл, без возможности восстановления используйте команду shred. Во время удаления файлов с помощью утилиты rm удаляется только ссылка на файл, само же содержимой файла по-прежнему находиться на диске, пока система не перезапишет его новыми данными, а пока этого не случится файл можно легко восстановить. Принцип действия утилиты такой — после удаления файла, его место на диске несколько раз перезаписывается. Опцией -n — можно указать количество перезаписей диска, по умолчанию используется 3. А если указать опцию -z программа при последней перезаписи запишет все нулями чтобы скрыть, уничтожение файла. ВыводыВот и все. Теперь вы знаете как удалить файл в Ubuntu, как видите, делать это не так уж сложно. Если у вас остались вопросы, пишите в комментариях! Источник |