Извините, я забыл упомянуть, что эти каталоги могут иметь файлы. Не удалось удалить некоторые из них из-за ошибки «найти: невозможно удалить` ./start ': каталог не пуст »
сборка мусора
@garbagecollection Я добавил обновление.
Джайпал Сингх
3
Вы можете использовать +вместо того, \;чтобы передавать более одного каталога за раз.
JFS
Спасибо @JFSebastian Хороший вопрос. Я добавлю это в ответ.
Как указывает другой ответ, вы можете попытаться найти все каталоги с именем testи удалить их
find -name "test" -type d -delete
Я столкнулся с некоторыми проблемами с перекрестной совместимостью на Mac, поэтому я использовал эту эквивалентную команду:
find -path "*/test" -type d -delete
-path : ищет шаблон в полностью определенном имени файла.
Однако в любом случае, если в каком-либо из названных каталогов testесть файлы, findони пожалуются на то Directory is not empty, что каталог не удастся удалить.
Если вы намеревались удалить все файлы, включая testкаталог, то мы можем использовать тот же трюк, чтобы удалить все файлы внутри каталогов, названных testпервыми.
find -path "*/test/*" -delete
Шаблон: "*/test/*"гарантирует, что мы удаляем файлы только в каталоге с именем /test/. Когда каталоги пустые, мы можем удалить каталоги, используя первую команду:
find -path "*/test" -type d -delete
Пример:
$ tree
.
├── mytest
│ └── test
│ └── blah.txt
├── test
│ ├── bar.jpg
│ └── dir
│ └── bar.bak
└── testdir
└── baz.c
5 directories, 4 files
$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│ └── test
├── test
└── testdir
└── baz.c
4 directories, 1 file
$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
└── baz.c
2 directories, 1 file
+
в поиске. Я понятия не имел, определенно хотел бы знать это давно.xargs
команда работала хорошо.-name: ищет переданное имя. Вы можете использовать
-regex
для предоставления имен на основе регулярных выражений-type: ищет типы файлов.
d
ищет только каталоги-delete: действие, которое удаляет найденный список.
В качестве альтернативы:
Как сказал в комментариях Дж. Ф. Себастьян :
Вы можете использовать
+
вместо того,\;
чтобы передавать более одного каталога за раз.источник
+
вместо того,\;
чтобы передавать более одного каталога за раз.еще один способ сделать это
Полезная ссылка для поиска: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml
источник
Вы также можете использовать опцию -exec
источник
Предполагая Bash 4+
Конечный слеш означает, что он будет соответствовать только каталогам. Заранее проводится тест с:
источник
Предположим, вы используете gnu find , вы можете использовать опцию -delete:
find . -name test -delete
что легче запомнить.
источник
Как указывает другой ответ, вы можете попытаться найти все каталоги с именем
test
и удалить ихЯ столкнулся с некоторыми проблемами с перекрестной совместимостью на Mac, поэтому я использовал эту эквивалентную команду:
Однако в любом случае, если в каком-либо из названных каталогов
test
есть файлы,find
они пожалуются на тоDirectory is not empty
, что каталог не удастся удалить.Если вы намеревались удалить все файлы, включая
test
каталог, то мы можем использовать тот же трюк, чтобы удалить все файлы внутри каталогов, названныхtest
первыми.Шаблон:
"*/test/*"
гарантирует, что мы удаляем файлы только в каталоге с именем/test/
. Когда каталоги пустые, мы можем удалить каталоги, используя первую команду:Пример:
источник