Почему команда удаления так работает

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
Nolan
Сообщения: 23

Почему команда удаления так работает

Сообщение Nolan »

Добрый день.

Есть каталог типа:

Код: Выделить всё

/app
       /assets
                  /.gitignore
                  /dir1
                  /dir2
                         /file1.txt                  
Задача - очистить каталог assets от всего кроме файла .gitignore.
Решается командой:

Код: Выделить всё

cd /app && rm -rf assets/*
Просто интересно, оно этой командой файл .gitignore не удаляет из-за принципов работы звездочки?
То что звездочка на скрытые файлы (с точкой) не распространяется по умолчанию?
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Почему команда удаления так работает

Сообщение olecya »

Оболчка сама подставляет (раскрывает) вместо звездочки все имеющиеся, начинающиеся не с точки фалы и в таком виде передается уже команде в качестве аргументов.
Выполните:

Код: Выделить всё

echo rm -rf assets/*
Добавлено (15:56):
Nolan писал(а):
16.11.2021 15:37
cd /app && rm -rf assets/*
Зачем менять текущую директорию?

Код: Выделить всё

echo rm -rf /app/assets/*
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Почему команда удаления так работает

Сообщение SLEDopit »

Nolan писал(а):
16.11.2021 15:37
То что звездочка на скрытые файлы (с точкой) не распространяется по умолчанию?
В bash'e есть shopt -s dotglob. При его включении файлы с точками будут входить в *. Но такое плохо переносится.

В качестве альтернативы можно find'ом пробежаться и всё поудалять. Например так:

Код: Выделить всё

find /app/assets/ -mindepth 1 -delete
* емнип, -delete это GNUтая фича, вместо неё можно -exec rm -r {} \+, или \+ тоже GNUтое?
** если mindepth не указать, то он и саму директорию удалит

Зато если файлов в директории очень много, то не наткнетесь на проблему, когда оболочка ничего не удаляет с ошибкой, что команда слишком длинная.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Почему команда удаления так работает

Сообщение olecya »

SLEDopit писал(а):
16.11.2021 16:54
Зато если файлов в директории очень много, то не наткнетесь на проблему, когда оболочка ничего не удаляет с ошибкой, что команда слишком длинная.
Тогда это не согласуется с этим
SLEDopit писал(а):
16.11.2021 16:54
вместо неё можно -exec rm -r {} \+, или \+ тоже GNUтое?
Исправим ситуацию:

Код: Выделить всё

-exec rm -r {} \;
Так же задача как раз и состояла в том чтобы не удалять скрытые файлы, а значит вариант с превышением количества параметров остается:

Код: Выделить всё

find * -exec rm -r {} \;
Значит надо явно указать имя:

Код: Выделить всё

find -name '[!.]*' -exec rm -r {} \;
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Почему команда удаления так работает

Сообщение Bizdelnick »

SLEDopit писал(а):
16.11.2021 16:54
вместо неё можно -exec rm -r {} \+, или \+ тоже GNUтое?
Нет, это стандартное. И, кстати, экранировать + нужды нет.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Почему команда удаления так работает

Сообщение SLEDopit »

olecya писала:
16.11.2021 17:21
Тогда это не согласуется с этим
Вполне согласуется. + довольно сообразительный и догадается побить файлы на группы, чтобы избежать такой ошибки.
А в случае с \; на каждый файл будет запущен отдельный rm, что будет заметно дольше в выполнении на большом количестве файлов.
Bizdelnick писал:
16.11.2021 18:05
И, кстати, экранировать + нужды нет.
Точно, спасибо. А я что-то на автомате всё \ добавляю.
Добавлено (01:28):
olecya писала:
16.11.2021 17:21
Так же задача как раз и состояла в том чтобы не удалять скрытые файлы
А вот этот момент я невнимательно прочитал. Мне почему-то показалось, что наоборот. Тогда нужно аккуратнее с исключениями, потому что скрытые файлы могут быть не только а первом уровне.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Ответить