Удалить файлы в папке bash

Обновлено: 07.07.2024

Вероятно, вы ищете gpgdir из пакета signing-party (стандартный репозиторий ubuntu), который может рекурсивно шифровать контуры.

Единственная причина, по которой rm -r ./* работает не всегда, состоит в том, что вы можете иметь скрытые файлы и / или папку, которые не соответствуют *.

С этой целью bash предоставляют возможность чтобы * соответствовал всем, даже скрытым объектам:

Может быть полезно сбросить dotglob в состояние по умолчанию (unset), если вы продолжаете использовать оболочку, в которой вы выполнили над командами:

Он также не может работать, когда у вас есть большое количество файлов – S.. 29 January 2016 в 23:04

Открыть терминал (Ctrl + Alt + T) ant type this:

Это будет соответствовать всем файлам и каталогам внутри somedir и его (grand-) детей, включая «скрытые» точечные файлы но исключая somedir из-за -mindepth 1, затем -delete их.

Не хватает объяснений, но все же лучший ответ. Также работает в OSX (за исключением, конечно, способа открытия терминала, конечно). – noamtm 5 February 2015 в 18:43

Используйте параметр xdev для удаления файлов только на границе устройства.

Поиск GNU имеет -delete. Это подразумевает -depth и легче запомнить, чем -depth -exec rm -Rf <> \; – Nils Toedtmann 15 January 2015 в 17:38

Чтобы удалить (в терминале) все файлы и подкаталоги, за исключением базового каталога с именем «dontdelete»:

Это не удаляет скрытые файлы, поэтому "все файлы" может быть слишком смелым утверждением. – Stefan van den Akker 25 July 2015 в 18:55

Вы можете использовать find с флагом -delete:

find dontDeleteMe/* -delete

Важно /*, поскольку он сообщает find искать только INSIDE папка с именем «dontDeleteMe».

Также убедитесь, что флаг -delete находится в конце команды find.

Это решение не удаляет скрытые файлы, если вы не включили dotglob. В противном случае использование опции флажка -mindepth 1 кажется единственным способом заставить его работать. – Stefan van den Akker 25 July 2015 в 18:59

Удалить все файлы, начиная с. в «каталоге» и во всех других файлах.

Хотя это не одобрено Neftas, это решение небезопасно!

Более безопасное решение:

Эта команда потенциально может быть опасной, поскольку вы также включаете каталоги . и . Этого можно избежать, изменив на , но тогда вы не удалите скрытые файлы только с одним символом, например .a. – Stefan van den Akker 25 July 2015 в 15:13 Это похоже на гораздо лучшее решение, чем то, с чем я столкнулся. Могу ли я предложить вам отредактировать свой ответ? – Stefan van den Akker 25 July 2015 в 15:49

Я не уверен, почему это так сложно, помогите мне, если я ошибаюсь

У этого есть небольшой недостаток в попытке удалить текущий каталог, который, конечно, не работает, потому что он все еще используется как рабочий каталог вызывающей оболочки. – David Foerster 15 September 2015 в 16:26

Существует еще более простой ответ:

cd dontDeleteMe rm -rf *

Время основной лекции системы: обязательно обратите внимание на то, где вы находитесь, когда используете подметающие команды как это.

Я не могу сказать этого достаточно. Я должен был восстановить коробку, потому что кто-то не обращал внимания и набрал rm -rf *, когда находился в /.

* nix предполагает, что если вы являетесь пользователем root или если вы являетесь sudo-ing как root, вы знаете, что вы делаете. Поэтому убедитесь, что вы знаете, что делаете, прежде чем это сделать.

Альтернатива, которая гарантирует, что ваша команда «cd» работает до того, как вы выпустите «rm», будет использовать

Что нужно: удаление файлов с определённым расширением из директории /home.

В /home может быть множество различных папок.

Файлов с разными расширениями может быть много.


BitSum ★★ ( 13.09.17 23:13:41 )
Последнее исправление: BitSum 13.09.17 23:13:48 (всего исправлений: 1)


куча вариантов 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 .
Так видно лучше? Никто и не собирался ^)


А, точно, спать надо больше :( Как же так. Наверное прокоментировать хотел пример выше, а взял последнее.

vodz ★★★★★ ( 14.09.17 07:44:45 )
Последнее исправление: vodz 14.09.17 07:47:22 (всего исправлений: 1)

А что, rm -r *.*ext* не катит уже?

1) нерекурсивный
2) на большом количестве файлов тянет на переполнение комстроки

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


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

Может выдать типа:

vodz ★★★★★ ( 14.09.17 09:12:28 )
Последнее исправление: vodz 14.09.17 09:13:52 (всего исправлений: 3)


колхоз, но с утра голова лучше не придумала)


Заодно пометь тему решенной


колхоз, но с утра голова лучше не придумала)

эм, давно не баше не писал, пардноньте, а то, что я поставил точку перед расширением не поможет?

. прогнал у себя по хомяку, нет ни одного ошибочного совпадения.


что я поставил точку перед расширением не поможет?

Нет, потому что маска развернется ещё в for i in *?[xyz]* <-- вот тут.

хм, спасибо, буду знать.

Так в итоге, какое конечное решение будет на баше? Чтобы я протестировал и обновил первый пост.

BitSum ★★ ( 14.09.17 11:54:08 )
Последнее исправление: BitSum 14.09.17 11:54:22 (всего исправлений: 1)


vodz ★★★★★ ( 14.09.17 11:59:48 )
Последнее исправление: vodz 14.09.17 12:02:48 (всего исправлений: 3)

С переменными и, особенно, массивами в bash лучше не связывайся, с ними всегда больше ошибок и тормозов, типичный пример тут Удалить файлы с определённым расширением. Как? (комментарий)


С переменными и, особенно, массивами в bash лучше не связывайся

Я осилил. И понял, что, во-первых, оно того не стоит и почти везде лучше итерацию по пассиву заменять на пайпы, xargs и т.п. и во-вторых, новичок точно напорется на грабли с файликами с пробелами, начинающимися на минус, с длиной командной строки и т.п.


во-первых, оно того не стоит и почти везде лучше

И этот поц говорит о тормозах и пробелах в именах.

Обновил первый пост. Добавил скрипт на баше.

Пожалуй его и буду использовать. Наиболее компактный вариант для меня, с учётом того, что выражений десятки.

BitSum ★★ ( 14.09.17 12:56:01 )
Последнее исправление: BitSum 14.09.17 12:57:50 (всего исправлений: 2)

Чтобы не выглядеть так как и вы голословным,

Вариант с итерацией по башевскому массиву проходит дерево столько раз, сколько ищется расширений - это может быть и 10 и 20 раз. Многократное замедление прохода по диску - это не голые слова, а суровая реальность. А через год ТС захочет решить те-же задачу тем-же способом, но забудет кавычки или поставит не те и будет удивляться, почему простой скрипт глючит.


Вариант с итерацией по башевскому массиву проходит дерево столько раз, сколько ищется расширений - это может быть и 10 и 20 раз.

Это вроде бы правильно, но в скриптах важно не задумыватся о работе внутри дерева интерпретатора, а их удобность. Так вот, поиск и правка хардкорного regex-а внутри скрипта у вас займёт кучу времени по сравнению со сколько комп затратит на цикл.

Хотя. если действительно считать миллисекунды, то да, надо формировать аргументы (-a -name ".$ext")* для ровно одного вызова find. Можно было б вам защитать 1:1, но вызов несколько find-ов это на много затратнее чем дерево bash-а и потому объяснение правильно лишь случайно :))) А скрипт становится развесистым и трудным для понимания.

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

vodz ★★★★★ ( 14.09.17 14:14:26 )
Последнее исправление: vodz 14.09.17 14:16:48 (всего исправлений: 2)


А я понял, вы не о внутренностях интерпретатора. Проход по файловой системе действительно долог. Разве что надеяться, что система обычно тут не очень тупит и в кеш попадает всё на первом проходе, так как файлы сами не читаются и память уходит только на сами каталоги. Признаю, думал о людях обычно глубже и сразу бросился отвечать. Но даже первый абзац остаётся в силе насчёт неудобств харкоженного и неудобного regex.

Проход по файловой системе действительно долог

Да ещё как. Если это зрелая файлопомойка на терабайт, то огого как долго можно по ней блуждать. А если оно по сети смонтировано, то всё ещё хуже. А если поиск идёт не по имени, а, например, по дате, то это вызов stat() на каждый файл.

Хотя на моём хомяке кеширование здорово помогает и разница не настолько велика, как я ожидал.

Трудночитаемость регэкспов признаю и вообще хотел бы, чтобы у find была опция -names-from-file (так-же, как grep --file=). скостылить для финда чтение паттернов из файла можно, но выглядит это ужасно.

Частыми операциями в файловой структуре являются создание файлов и каталогов, их копирование, перемещение, переименование, а также удаление. Очевидно для подобных действий в командной оболочке Linux должны быть предусмотрены специальные команды.

Копирование файлов и каталогов

В Bash для копирования файлов используется команда cp (от "copy"), которой обычно передаются два аргумента:

адрес с именем исходного файла,

новый адрес с именем или просто адрес каталога, куда помещается копия.

Адрес может быть как абсолютным, так относительным. Если операции с файлами выполняются в текущем каталоге, то указывать адрес смысла нет. Пишется только имя исходного файла и имя копии. Поскольку файлов с одинаковыми именами и адресами быть не может, имя копии должно отличаться от имени исходного файла.

cp readme readme2

В данном случае создается копия файла readme, которая остается в той же директории под именем readme2.

cp readme Desktop/

В папку Desktop копируется файл readme. Здесь текущим является родительский Desktop'у каталог. Имена копии и файла оригинала будут совпадать, а вот полные адреса – нет.

cp /home/irina/tux.jpg /mnt/D/pingvin.jpg

Здесь копируется файл из одного каталога в другой, используются абсолютные адреса, имя копии изменяется.

Если надо скопировать несколько разных файлов в один и тот же каталог, то после команды cd сначала перечисляются все файлы-оригиналы, а последним указывается каталог, куда помещаются копии. Понятно, что при таком групповом действии имена файлов изменить нельзя.

Чтобы скопировать каталог со всем его содержимым, необходимо использовать ключ -r команды cp:

cp -r ./letters ./oldletters

Перемещение и переименование

В Bash-оболочке Linux для перемещения и переименования используется одна и та же команда – mv (от "move" – перемещать). Переименование можно рассматривать как частный случай перемещения, ведь по-сути изменяется полный адрес файла, что равносильно перемещению, даже если файл остается в том же каталоге.

Также как в случае cp, для mv необходимо указать пару аргументов. Выбор между перемещением и переименованием зависит от того, что это за аргументы. При перемещении файл меняет свой адрес, следовательно, если в первом и втором аргументах указаны разные адреса, то произойдет перемещение. Если адреса одинаковые, а различаются только имена, происходит переименование. Кроме того, перемещение может быть совмещено с переименованием.

В случае перемещения без переименования во втором аргументе указывается только каталог места назначения.

mv document.txt Work

mv document.txt Work/doc23.txt

Здесь в первом случае файл document.txt перемещается в каталог Work. Во-втором случае одновременно происходит перемещение файла и его переименование: файл document.txt перемещается в директорию Work и получает новое имя doc23.txt.

При использовании команды mv для переименования в качестве второго аргумента указывается новое имя:

mv order.txt orderNew.txt

mv Work/list.odt Work/names.odt

Каталоги перемещаются и переименовываются по тому же принципу, что и файлы. Групповое перемещение файлов работает также, как с командой cp.

Создание файлов и каталогов

Новые директории создаются командой mkdir. Например, чтобы создать каталог Work в текущей директории необходимо выполнить следующую команду:

mkdir Work
или
mkdir ./Work

Существует множество способов создания файлов, обычно они создаются какой-либо программой. Если все же возникает необходимость создать пустой файл, сделать это можно с помощью программы touch. В качестве аргумента ей передается имя создаваемого файла. Еще один способ – перенаправление вывода какой-либо команды в файл. Пример:

Здесь программа cal выводит календарь на текущий месяц, а поскольку стоит знак перенаправления вывода, то вывод команды будет записан в файл January, находящийся в папке Work.

Удаление файлов и каталогов

Для удаления файлов используется команда rm. Например:

Командой rmdir можно удалить пустой каталог. Если же каталог не пуст, следует использовать команду rm с ключом -r:

Вопросы

У вас в каталоге есть файлы с разными расширениями. Вам надо группу файлов, имеющих одно и тоже расширение, скопировать в другой каталог. Как это сделать одной командой?

Какой ключ надо использовать, чтобы при перемещении случайно не перезаписать уже имеющийся в каталоге файл с таким именем?

Курс с ответами к заданиям и дополнительными уроками:
android-приложение, pdf-версия.

Favorite

Добавить в избранное

Bash Heredoc

П ри работе с Linux Mint 20 вам придется работать с разными файлами и папками. Но метод создания или удаления папки или каталога в некоторой степени отличается от создания или удаления файла. При удалении файлов или каталогов из командной строки будьте бдительны, потому что после удаления каталога с помощью команд, упомянутых в этой статье, он больше не будет полностью восстановлен.

В этой статье вы узнаете обо всех основных методах удаления папок в Bash.

Есть два метода удаления папок или каталогов. Это следующие:

Давайте попробуем эти два метода на нескольких примерах удаления папок.

Команда rmdir

Если вы пользователь Linux и хотите удалить пустую папку, вы должны использовать команду «rmdir». Итак, в самом начале вы должны проверить, сколько папок в настоящее время присутствует в вашем домашнем каталоге, следующим образом:

Удалить одну папку

Во-первых, создайте новый каталог с именем «Folder1», используя следующую простую команду, и снова перечислите все каталоги. Вы увидите недавно созданную папку в списке каталогов.

Чтобы удалить эту вновь созданную папку, которая сейчас пуста, используйте следующую команду:

Перечислите все каталоги, и вы увидите, что конкретная папка была удалена и отсутствует в списке.

Удалить папку в папке

Составьте список всех имеющихся у вас каталогов. Создайте новый каталог с именем «Folder2» с помощью команды «mkdir» следующим образом:

Теперь создайте другую папку, «Test1», во вновь созданной папке с именем «Folder2».

Вы также можете создать папку внутри папки, выполнив команду «cd», как показано ниже:

Итак, вам нужно удалить папку «Test1», используя следующую команду:

Вы также можете попробовать другой метод удаления папки в папке, используя команду «cd» вместо пути к папке, как показано ниже:

Удалить несколько папок

Чтобы удалить несколько папок за раз, вы должны сначала создать несколько папок. Итак, создайте три папки с именами «Test1», «Test2» и «Test3» с помощью команды «mkdir». Перечислите все вновь созданные папки, используя команду ls.

Вы можете использовать следующую команду для удаления папок, если у них разные имена:

Если у ваших папок разные имена, попробуйте следующую команду, чтобы удалить их:

В этой команде знак «*» показывает, что она выберет все папки, которые начинаются с определенного слова «folder».

Команда rm

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

Теперь создайте новую папку с именем «New», а также создайте в этой папке другие папки, такие как «Test1», «Test2», «Test3» и т. д.

Проверьте доступные в настоящее время папки в вашем домашнем каталоге.

Теперь пора использовать команду «rm», чтобы удалить непустую папку. Для этого используйте следующую команду «rm», за которой следует имя удаляемой папки:

В этой команде флаг «-r» означает, что сначала нужно удалить все содержимое папки.

Вы также можете использовать заглавную букву «R» вместо маленькой буквы «r». Вы увидите, что папка будет удалена. Не только это, но и все папки внутри папки «New» также удаляются вместе с ним.

Есть еще одна команда с небольшим изменением для удаления непустой папки, как показано ниже:

В этой конкретной команде флаг «-r» удалит все подпапки или файлы в этой конкретной папке, а затем перейдет к папке, которую необходимо удалить. С другой стороны, флаг «f» используется для принудительного удаления этой папки без отображения запроса.

В вышеупомянутой команде флаг «v» используется для отображения процесса удаления папки с текстовым выводом.

Заключение

Подводя итог, мы успешно обсудили методы удаления пустых и непустых папок в Bash с помощью команд «rmdir» и «rm» соответственно. Мы также подробно описали, как удалить пустые папки с различными условиями, например, одну папку, папку в папке и удалить несколько папок. Надеемся, эта статья очень помогла вам раскрыть основы удаления папок в Bash. Кроме того, следуя приведенной выше статьи, теперь вы можете удобно удалять файлы и папки в Bash.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: