Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.
Модератор: Bizdelnick
Nolan
Сообщения: 23
Сообщение
Nolan » 16.11.2021 15:37
Добрый день.
Есть каталог типа:
Код: Выделить всё
/app
/assets
/.gitignore
/dir1
/dir2
/file1.txt
Задача - очистить каталог assets от всего кроме файла
.gitignore.
Решается командой:
Просто интересно, оно этой командой файл .gitignore не удаляет из-за принципов работы звездочки?
То что звездочка на скрытые файлы (с точкой) не распространяется по умолчанию?
olecya
Сообщения: 904
ОС: debian, fedora (i3-wm)
Сообщение
olecya » 16.11.2021 15:53
Оболчка сама подставляет (раскрывает) вместо звездочки все имеющиеся, начинающиеся не с точки фалы и в таком виде передается уже команде в качестве аргументов.
Выполните:
Добавлено (15:56):
Nolan писал(а): ↑ 16.11.2021 15:37
cd /app && rm -rf assets/*
Зачем менять текущую директорию?
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 16.11.2021 16:54
Nolan писал(а): ↑ 16.11.2021 15:37
То что звездочка на скрытые файлы (с точкой) не распространяется по умолчанию?
В bash'e есть
shopt -s dotglob . При его включении файлы с точками будут входить в
* . Но такое плохо переносится.
В качестве альтернативы можно
find 'ом пробежаться и всё поудалять. Например так:
* емнип,
-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
Сообщения: 904
ОС: debian, fedora (i3-wm)
Сообщение
olecya » 16.11.2021 17:21
SLEDopit писал(а): ↑ 16.11.2021 16:54
Зато если файлов в директории очень много, то не наткнетесь на проблему, когда оболочка ничего не удаляет с ошибкой, что команда слишком длинная.
Тогда это не согласуется с этим
SLEDopit писал(а): ↑ 16.11.2021 16:54
вместо неё можно -exec rm -r {} \+, или \+ тоже GNUтое?
Исправим ситуацию:
Так же задача как раз и состояла в том чтобы не удалять скрытые файлы, а значит вариант с превышением количества параметров остается:
Значит надо явно указать имя:
Bizdelnick
Модератор
Сообщения: 21245
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 16.11.2021 18:05
SLEDopit писал(а): ↑ 16.11.2021 16:54
вместо неё можно
-exec rm -r {} \+ , или
\+ тоже GNUтое?
Нет, это
стандартное . И, кстати, экранировать
+ нужды нет.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 17.11.2021 01:25
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.