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

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

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

  • -ф, --форс

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

  • -r, -R, --рекурсивный

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

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

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

решение1

Вот что говорится на странице руководства CentOS:

-f, --force
    ignore nonexistent files, never prompt

-r, -R, --recursive
    remove directories and their contents recursively

-rИз того, что я понял (благодаря некоторым комментариям ниже), для флагов и справедливо следующее -f:

  • рекурсивно удаляет содержимое каталога, включая скрытые файлы и подкаталоги
  • В зависимости от конфигурации, он может запросить разрешение (например, при использовании флага --interactive). Некоторые дистрибутивы делают это по умолчанию.
  • может использоваться для удаления каталога, если вы хотите это сделать, просто укажите путь к каталогу (например: /path/to/directory)

  • не удаляет рекурсивно содержимое каталога, а только удаляет файлы, которые напрямую соответствуют указанному пути (например, example/file1или example/*).
  • Никогда не удаляет подкаталоги
  • Никогда не запрашивает разрешения, в основном yes to allв Windows

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

example/
  file1
  file2
  file3
  .file
  dir/
    file1
    file2
    file3
    .file

Я включил детализация и интерактивный режим по умолчанию для этих примеров. Некоторые дистрибутивы делают это, а некоторые нет.

пример rm

$ rm example
rm: cannot remove `example': Is a directory

Как видите, rmпо умолчанию каталоги не удаляются.

пример rm -f

$ rm example -f
rm: cannot remove `example': Is a directory

Использование -fфлага по-прежнему не позволяет удалять каталоги.

пример rm -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'

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

решение2

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.

Связанный контент