2014-10-20 3 views
0

Есть ли элегантный или простой способ удаления содержимого папки таким образом, что нет выхода ошибки, если он пуст?Усечь директорию в bash

Следующая команда

$ rm -r $dir/* 

не работает, если каталог пуст, так как в таком случае wilcard * не расширяется, и вы получите ошибку о том, что rm не может найти файл *.

Конечно, стандартный способ - проверить, является ли он пустым (с ls $dir | wc -w или find $dir -link 2 или любой другой связанной командой) и в противном случае удалять его содержимое.

Есть ли альтернативный способ не проверять содержимое папки и вместо этого «обрезать» каталог?

ответ

5

Bash

Просто

$ rm -rf dir/* 

(По умолчанию я считаю) Bash не жалуется на то, что не найдешь ничего с глобусом. Он просто передает свой буквальный Glob через вашу команду:

$ echo dir/* 
dir/* 

Когда rm не находит имя файла, которое имеет буквальный Глоб характер, она жалуется, не найдя файл это было предложено удалить:

$ rm "dir/*" 
rm: cannot remove ‘dir/*’: No such file or directory 
$ echo $? 
1 

Но если вы вынуждаете его, он не будет жаловаться:

$ rm -f "dir/*" 
$ echo $? 
0 

Я не знаю, что припев-из-пожалуйтесь POSIX.

Обратите внимание, что если у вас нет опции оболочки «dotglob», вы пропустите файлы, которые начинаются с «скрытых» файлов с точками.

Вообще

Zsh не проходит буквального Glob по умолчанию. Вы должны попросить его «set -o nonomatch».

$ echo dir/* 
zsh: no matches found: dir/* 
$ echo $? 
1 
$ set -o nonomatch 
$ echo dir/* 
dir/* 

Для совместимости, я бы не использовать выше современный-Баш-специфический «rm -rf dir/*», но буду использовать более общее, широко совместимое решение:

$ find dir -mindepth 1 -delete 

Найти все файлы в " dir "на минимальной глубине 1 (сам" dir "находится на глубине 0) и удаляет их.

3

Вы можете использовать rm -rf:

rm -rf "$dir"/* 

По man bash:

-f, --force 
      ignore nonexistent files and arguments, never prompt 
+1

... Я поставил вопрос слишком быстро. Очевидное решение. Благодарю. –

Смежные вопросы