Удаление всех файлов определённого типа в каталоге
Есть каталог rare, в нём — куча подкаталогов и файлов. Нужно удалить все .m3u файлы. Делаю:
однако эта команда оставляет .m3u файлы, если в путях есть пробелы. Как заставить её обрабатывать пробелы?
Добавить двойные кавычки
Отличный совет, чувак. Я сейчас удалил половину каталога с музыкой.
Тогда экранированные двойные кавычки.
«Чуваком» будешь отца своего звать, а я тебе ответил на вопрос касательно классического метода, что решает эту задачу.
Не зря я написал именно так, как написал.
Ууу, кто-то только что спалил виртуала
Как такое могло получиться? Вы же не скопипастили «find -delete»?
/Music -type f -name «.txt» -delete в моем случае просто удалило все .txt файлы. С чего у вас удалилась музыка, если вы удаляете .m3u только?
Update:
Не нужно никаких костылей вроде xargs, find умеет удалять файлы с параметром -delete. Но для начала без него, проверьте, чтобы find искал все необходимые файлы, а потом уже дописывайте -delete, чтобы их удалить.
Источник
Удалить файлы с определённым расширением. Как?
Как удалить файлы с определённым расширением?
Что нужно: удаление файлов с определённым расширением из директории /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/ удалять наверное не надо. 🙂
Если позанудствовать . каталоги с именами типа a.txt/ удалять наверное не надо
. -type f .
Так видно лучше? Никто и не собирался ^)
А, точно, спать надо больше 🙁 Как же так. Наверное прокоментировать хотел пример выше, а взял последнее.
А что, rm -r *.*ext* не катит уже?
1) нерекурсивный
2) на большом количестве файлов тянет на переполнение комстроки
Такой вариант ещё предложили, ну очень удобный.
Такой вариант ещё предложили, ну очень удобный.
Это небезопасное извращение. Если подствить в list «расширения» тоже в виде масок, то вместо передачи для поиска этих масок будут искаться файлы с именами удовлетворяющие этой маске:
Может выдать типа:
колхоз, но с утра голова лучше не придумала)
Заодно пометь тему решенной
колхоз, но с утра голова лучше не придумала)
У вас таже самая ошибка. Уж сколько раз твердили миру, что есть специально придуманный синтаксис «$», с кавычками, прямо отдельной строкой в документации.
эм, давно не баше не писал, пардноньте, а то, что я поставил точку перед расширением не поможет?
что я поставил точку перед расширением не поможет?
Нет, потому что маска развернется ещё в for i in *?[xyz]* ★★★★★ ( 14.09.17 11:41:35 )
хм, спасибо, буду знать.
Так в итоге, какое конечное решение будет на баше? Чтобы я протестировал и обновил первый пост.
Так вроде же понятно объяснил, надо записать «$
С переменными и, особенно, массивами в bash лучше не связывайся, с ними всегда больше ошибок и тормозов, типичный пример тут Удалить файлы с определённым расширением. Как? (комментарий)
С переменными и, особенно, массивами в bash лучше не связывайся
Смешно. Просто эталонно-гранитное «неасилил».
Я осилил. И понял, что, во-первых, оно того не стоит и почти везде лучше итерацию по пассиву заменять на пайпы, xargs и т.п. и во-вторых, новичок точно напорется на грабли с файликами с пробелами, начинающимися на минус, с длиной командной строки и т.п.
во-первых, оно того не стоит и почти везде лучше
Это просто бла-бла. Чтобы не выглядеть так как и вы голословным, то «всегда» на самом деле означает «там, где нет bash», что мало похоже на топик с таким тегом.
И этот поц говорит о тормозах и пробелах в именах.
Обновил первый пост. Добавил скрипт на баше.
Пожалуй его и буду использовать. Наиболее компактный вариант для меня, с учётом того, что выражений десятки.
Чтобы не выглядеть так как и вы голословным,
Вариант с итерацией по башевскому массиву проходит дерево столько раз, сколько ищется расширений — это может быть и 10 и 20 раз. Многократное замедление прохода по диску — это не голые слова, а суровая реальность. А через год ТС захочет решить те-же задачу тем-же способом, но забудет кавычки или поставит не те и будет удивляться, почему простой скрипт глючит.
Вариант с итерацией по башевскому массиву проходит дерево столько раз, сколько ищется расширений — это может быть и 10 и 20 раз.
Это вроде бы правильно, но в скриптах важно не задумыватся о работе внутри дерева интерпретатора, а их удобность. Так вот, поиск и правка хардкорного regex-а внутри скрипта у вас займёт кучу времени по сравнению со сколько комп затратит на цикл.
Хотя. если действительно считать миллисекунды, то да, надо формировать аргументы (-a -name «.$ext»)* для ровно одного вызова find. Можно было б вам защитать 1:1, но вызов несколько find-ов это на много затратнее чем дерево bash-а и потому объяснение правильно лишь случайно :))) А скрипт становится развесистым и трудным для понимания.
но забудет кавычки или поставит не те и будет удивляться
Ну на это я уже отвечал, это эталонное «ниасилил.»
А я понял, вы не о внутренностях интерпретатора. Проход по файловой системе действительно долог. Разве что надеяться, что система обычно тут не очень тупит и в кеш попадает всё на первом проходе, так как файлы сами не читаются и память уходит только на сами каталоги. Признаю, думал о людях обычно глубже и сразу бросился отвечать. Но даже первый абзац остаётся в силе насчёт неудобств харкоженного и неудобного regex.
Проход по файловой системе действительно долог
Да ещё как. Если это зрелая файлопомойка на терабайт, то огого как долго можно по ней блуждать. А если оно по сети смонтировано, то всё ещё хуже. А если поиск идёт не по имени, а, например, по дате, то это вызов stat() на каждый файл.
Хотя на моём хомяке кеширование здорово помогает и разница не настолько велика, как я ожидал.
Трудночитаемость регэкспов признаю и вообще хотел бы, чтобы у find была опция -names-from-file (так-же, как grep —file=). скостылить для финда чтение паттернов из файла можно, но выглядит это ужасно.
Источник
Как удалить файл в Linux через терминал
В операционной системе Linux практически все операции можно выполнить с помощью терминала. Для этого в системе предусмотрено мужество очень мощных и гибких команд и утилит, которые позволяют очень тонко управлять системой.
В этой инструкции мы рассмотрим удаление файлов. Это типичная и очень простая процедура, выполнять которую должен уметь любой пользователь. Здесь вы узнаете, как удалить файл в Linux через терминал и какие команды для этого понадобятся. Статья будет актуальной для любого дистрибутива Linux, например, Ubuntu Linux, Debian и т. д.
Удаление файлов с помощью rm
Для того чтобы удалить файл в Linux через терминал необходимо использовать команду « rm » (от английского «remove»). Данная команда удаляет все указанные ей файлы, но по умолчанию не удаляет каталоги. Чтобы позволить команде « rm » удалять каталоги нужно добавить опцию « -r » или « -R ». Более подробно об этом во второй половине статьи.
Также нужно отметить, что команда « rm » не выполняет физическое удаление данных, вместо этого указанные файлы просто удаляются из файловой системы, а занимаемое ими место маркируется как свободное. Это означает, что после удаления данные остаются на диске и пока они не будут перезаписаны другими данными, их можно будет восстановить с помощью специальных программ. Для физического удаления данных с перезаписью диска следует использовать команду « shred ».
В общем случае для удаления файла в Linux через терминал достаточно просто ввести в терминал « rm » и указать имя документа. Например, для того чтобы удалить « file1.txt » из текущего каталога нужно выполнить вот такую команду:
Если удаляемый файл находится не в текущем каталоге, то в терминале нужно указать полный путь. Например, это может выглядеть вот так:
При необходимости, с помощью команды « rm » можно удалить сразу несколько файлов. Для этого просто введите « rm » и перечислите имена через пробел, например:
Для удаления большого количества похожих файлов можно использовать маски. Например, чтобы удалить все документы с расширением txt нужно выполнить вот такую команду:
Также маску можно использовать для удаления вообще всех файлов. Например, чтобы удалить все файлы в текущей папке нужно выполнить:
Аналогичным способом можно удалить все файлы в определенной папке:
Главное, соблюдать осторожность, так как при использовании масок можно удалить что-то лишнее.
Синтаксис и опции команды rm
Команда « rm » имеет множество опций, что позволяет очень тонко управлять процессом удаления файлов. Вы можете изучить все доступные опции если введете в терминал Linux команду « man rm ». Здесь же мы будем рассматривать самые простые и часто используемые опции.
Синтаксис команды « rm » выглядит следующим образом:
Разберем основные опции команды rm:
Теперь разберем некоторые опции, которые часто используются при удалении файлов в Linux через терминал. Например, очень часто возникает необходимость удалить папку вместе с всем содержимым. Для этого нужно использовать опцию «-r», которая включает рекурсивный обход папок. Например, для того чтобы удалить папку «folder1» и все ее содержимое нужно выполнить:
Если права доступа к файлу разрешают только чтение, то в терминале Linux появится запрос подтверждения, и чтобы продолжить вам нужно будет ввести букву « y » (от англ. «yes»).
Чтобы избежать такой ситуации и удалять все файлы без предупреждения нужно использовать опцию « -f ». Например:
Не редко возникает необходимость удалить папку вместе со всеми файлами и без запросов на подтверждение. В этом случае нужно комбинировать опции « -r » и « -f ». В результате команда выглядит вот так:
Если вы, наоборот, хотите каждый раз получать запрос подтверждения, то команду « rm » нужно выполнять с опцией « -i ». Например, для того чтобы удалить все файлы в текущем каталоге с запросом подтверждения нужно выполнить:
Также бывает полезной опция « -v ». При ее использовании в терминале будет появляться подробная информация о выполняемых действиях. Например, для того чтобы удалить все файлы в текущем каталоге и вывести информацию в терминал нужно выполнить:
Также вывод информации можно перенаправить в файл. Для этого после команды нужно использовать оператор перенаправления вывода ( > ) и указать название файла. Например:
Естественно все эти опции можно комбинировать, в зависимости от ваших задач.
Поиск и удаление файлов с помощью find
Также нужно отметить, что существуют и альтернативные способы удаления файлов. Например, вы можете использовать команду поиска « find ». Команда « find » будет полезна в тех случаях, когда вам нужно удалить определенные файлы в целом ряде папок.
Например, для того чтобы найти и удалить все txt-файлы в текущей и во всех вложенных папках можно выполнить вот такую команду:
Чтобы узнать больше об использовании « find » введите в терминал команду « man find ».
Источник