В чем разница между rm -r и rm -f?
Из руководства:
-f, --force
игнорировать несуществующие файлы, никогда не запрашивать
-r, -R, --recursive
удалить содержимое каталогов рекурсивно
Хотя это описание параметров иное, при попытке удалить пустую папку (без rmdir для этого примера) она дает тот же результат.
-f
не будет печатать ошибку или что-либо по сравнению с -r
это единственная разница или есть особый тип ситуаций, когда один вариант лучше другого или ситуации, когда один из этих вариантов просто не будет работать, а другой будет работать?
2 ответа
Вот что говорит man-страница в CentOS:
-f, --force
ignore nonexistent files, never prompt
-r, -R, --recursive
remove directories and their contents recursively
Из того, что я понял (благодаря некоторым комментариям ниже), следующее верно для -r
а также -f
флаги:
-р
- рекурсивно удаляет содержимое каталога, включая скрытые файлы и подкаталоги
- в зависимости от вашей конфигурации, он может запросить разрешение (например, при использовании
--interactive
флаг). Некоторые дистрибутивы делают это по умолчанию. - можно использовать для удаления каталога, если вы хотите это сделать, просто укажите путь к каталогу (например:
/path/to/directory
)
-f
- не рекурсивно удаляет содержимое каталога, а только удаляет файлы, которые непосредственно соответствуют заданному пути (например,
example/file1
или жеexample/*
). - Никогда не удаляет подкаталоги
- Никогда не просит разрешения, в основном
yes to all
в винде
Ниже приведены несколько примеров, все они начинаются со следующей структуры:
example/
file1
file2
file3
.file
dir/
file1
file2
file3
.file
Я включил многословие и интерактивный режим по умолчанию для этих примеров. Некоторые дистрибутивы делают это, а другие нет.
пример рм
$ rm example
rm: cannot remove `example': Is a directory
Как вы видете, rm
не удаляет каталоги по умолчанию.
пример рм -f
$ rm example -f
rm: cannot remove `example': Is a directory
С использованием -f
Флаг по-прежнему не позволяет удалить каталоги.
пример рм -r
$ rm example -r
rm: descend into directory `example'? yes
rm: remove regular empty file `example/file3'? yes
removed `example/file3'
rm: remove regular empty file `example/file2'? yes
removed `example/file2'
rm: descend into directory `example/dir'? yes
rm: remove regular empty file `example/dir/.file'? yes
removed `example/dir/.file'
rm: remove regular empty file `example/dir/file3'? yes
removed `example/dir/file3'
rm: remove regular empty file `example/dir/file2'? yes
removed `example/dir/file2'
rm: remove regular empty file `example/dir/file1'? yes
removed `example/dir/file1'
rm: remove directory `example/dir'? yes
removed directory: `example/dir'
rm: remove regular empty file `example/file1'? yes
removed `example/file1'
rm: remove directory `example'? yes
removed directory: `example'
Как видите, у вас запрашивают разрешение для каждого отдельного файла и каталога, скрытые файлы также удаляются.
Пример rm /* -f
$ rm example/* -f
rm: cannot remove `example/dir': Is a directory
removed `example/file1'
removed `example/file2'
removed `example/file3'
Здесь вас не спрашивают разрешения, каталоги не удаляются и не являются скрытыми файлами.
Пример rm /* -r
$ rm example/* -r
rm: descend into directory `example/dir'? yes
rm: remove regular empty file `example/dir/.file'? yes
removed `example/dir/.file'
rm: remove regular empty file `example/dir/file3'? yes
removed `example/dir/file3'
rm: remove regular empty file `example/dir/file2'? yes
removed `example/dir/file2'
rm: remove regular empty file `example/dir/file1'? yes
removed `example/dir/file1'
rm: remove directory `example/dir'? yes
removed directory: `example/dir'
rm: remove regular empty file `example/.file'? yes
removed `example/file'
rm: remove regular empty file `example/file1'? yes
removed `example/file1'
rm: remove regular empty file `example/file2'? yes
removed `example/file2'
rm: remove regular empty file `example/file3'? yes
removed `example/file3'
Здесь удаляется содержимое каталога примера (не самого каталога), включая скрытые файлы.
rm -r mydir
удалит mydir
каталог со всем его содержимым.
rm -f mydir
не удалит каталог (ни пустой, ни с контентом). Он сообщит об ошибке:
в BSD/OS X:
rm: mydir/: is a directory
в GNU/Linux:
rm: cannot remove 'mydir': Is a directory
Возможные объяснения rm
Команда ведет себя независимо от заданных аргументов (от наиболее вероятных до наименее вероятных):
- у вас есть псевдоним оболочки
rm
определены, и он передает некоторые определенные параметры (например,-r
) кrm
команда - вы вызываете скрипт с именем
rm
который также передает дополнительные параметры фактической команде - у тебя есть обычай
rm
исполнимый
Вы можете проверить первые две возможности, выполнив /bin/rm -f mydir
,