В чем разница между rm -r и rm -f?

11077
Cerberussian

Из руководства:

  • -f, --force

    игнорировать несуществующие файлы, никогда не запрашивать

  • -r, -R, --recursive

    удалить содержимое каталогов рекурсивно

Хотя это описание параметров отличается, при попытке удалить пустую папку (без rmdir для этого примера) она дает тот же результат.

-fне будет печатать ошибку или что-то в сравнении с -rэтим, единственное ли это отличие или есть определенный тип ситуаций, когда один из вариантов лучше другого или ситуации, когда один из этих вариантов просто не будет работать, а другой будет работать?

0
Какую систему вы используете? techraf 8 лет назад 0
В пустой директории они * дадут тот же результат, что и нечего удалять. Попробуйте это на дереве файлов и каталогов, они дадут разные результаты. Mokubai 8 лет назад 2
Что вы имеете в виду, что они дают одинаковый результат? `rm -r emptydir` удаляет этот каталог,` rm -f emptydir` - нет. Это два совершенно разных параметра командной строки, каждый из которых делает то, что говорит его документация. egmont 8 лет назад 0

2 ответа на вопрос

2
cascer1

Вот что говорит 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в Windows

Ниже приведены несколько примеров, все они начинаются со следующей структуры:

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' 

Здесь удаляется содержимое примера каталога (не самого каталога), включая скрытые файлы.

Звездочка не означает неограниченную рекурсию. Если он соответствует подкаталогам (например, `example / subdir`), он больше не будет спускаться, и rm будет _still_ игнорировать эти каталоги. (У некоторых оболочек есть `**`, которая рекурсивна.) grawity 8 лет назад 0
Да, я никогда этого не знал. Я обновлю ответ. cascer1 8 лет назад 0
Кроме того, `*` обычно не соответствует "точечным" файлам (я полагаю, что он должен был игнорировать `.` и` ..`, но в итоге он игнорировал _all_ скрытые файлы), поэтому только `rm -r dir / *` может не обязательно очищать каталог; например, он пропустит `dir / .git`. grawity 8 лет назад 0
Спасибо, я думаю, что теперь я обновил ответ, чтобы правильно отобразить различия между `-r` и` -f`, хотя, возможно, я немного переборщил. cascer1 8 лет назад 0
Спасибо за любой вклад (включая другие повторы)! Все ответы вместе помогли мне понять это лучше. Кто-то спросил мою ОС - я использую Ubuntu / Linux. Cerberussian 8 лет назад 0
0
techraf

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поведения команды независимо от заданных аргументов (от наиболее вероятных до наименее вероятных):

  1. у вас есть определенный псевдоним оболочки, rmи он передает некоторые определенные параметры (например -r) в rmкоманду
  2. Вы вызываете скрипт с именем, rmкоторый также передает дополнительные параметры фактической команде
  3. у вас есть пользовательский rmисполняемый файл

Вы можете проверить первые две возможности, выполнив /bin/rm -f mydir.