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

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

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

Другие вопросы по тегам