Удалить все файлы определенного расширения linux

Удаление всех файлов определённого типа в каталоге

Есть каталог 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) на большом количестве файлов тянет на переполнение комстроки

Такой вариант ещё предложили, ну очень удобный.

Читайте также:  Windows livecd что это

Такой вариант ещё предложили, ну очень удобный.

Это небезопасное извращение. Если подствить в 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-а и потому объяснение правильно лишь случайно :))) А скрипт становится развесистым и трудным для понимания.

но забудет кавычки или поставит не те и будет удивляться

Ну на это я уже отвечал, это эталонное «ниасилил.»

Читайте также:  Обзор minecraft для windows 10

А я понял, вы не о внутренностях интерпретатора. Проход по файловой системе действительно долог. Разве что надеяться, что система обычно тут не очень тупит и в кеш попадает всё на первом проходе, так как файлы сами не читаются и память уходит только на сами каталоги. Признаю, думал о людях обычно глубже и сразу бросился отвечать. Но даже первый абзац остаётся в силе насчёт неудобств харкоженного и неудобного 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 » из текущего каталога нужно выполнить вот такую команду:

Если удаляемый файл находится не в текущем каталоге, то в терминале нужно указать полный путь. Например, это может выглядеть вот так:

Читайте также:  Kmspico windows 10 активация windows

При необходимости, с помощью команды « 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 ».

Источник

Оцените статью