Будет ЛС всегда список файлов, что РМ будет удалить?

Что-то я чувствую, что я должен знать наверняка: если я ЛС в <то> У, будетРМ <что-то>удалите ровно те же файлы, что командыlsотображается? Существуют ли обстоятельства, при которыхРМможет удалить файлы, которыеОбщ` не показывают? (Это в 18.04 Баш)

Редактировать: спасибо всем, кто ответил. Я думаю, что полный ответ-это совокупность всех ответов, поэтому я принял самые-проголосовали ответ как "ответ" по.

Неожиданные вещи, которые я узнал по пути:

  • команды ls не так проста, как можно подумать в его применении своих аргументов
  • В простом ООН-повозился с установкой Убунту .bashrc и псевдонимы команды ls
  • Дон'т имя вашего файлы, начинающиеся с тире, как могут выглядеть аргументы команды, и называя одну Р просят за это!
Комментарии к вопросу (15)
Решение

Ну, обе команды ls и РМ работать на аргументы, которые передаются в них.

Эти аргументы могут быть простой файл, поэтому файл `общ. ДОБ " и " файл RM.доб действуют на один и тот же файл и исход ясен (список в файл / удалить файл).

Если вместо аргументов-это каталог, ЛС каталоге перечислены _content_ каталога, в то время как РМ каталога выиграл&#39;т работать "как есть" (т. е.РМбез флагов не может удалить каталоги, а если вы делаете РМ -Р каталог, рекурсивно удаляет _all files_ в разделеКаталог` и самой директории).

Но имейте в виду, что аргументы командной строки могут быть подвергнуты shell expansion, так что's не always guaranteed, что те же аргументы передаются в обе команды если они содержат специальные символы, переменные, выход из других команд и т. д.

Как крайний пример, думаю команды ls $(Рэнд).тхт " и " РМ $(Рэнд).тхт, аргументы "в этом" но результаты совершенно разные!

Комментарии (3)

Если вы'вновь думая о чем-то вроде команды ls фу*.тхт против РМ фу*.тхт, тогда да, они будут показывать и удалить одинаковые файлы. Shell расширяет Глоб, и передает его в команду, и команды работают на перечисленных файлов. Одно перечисление их, одно их устранения.

Очевидная разница заключается в том, что если любой из этих файлов оказался каталог, то команды ls будет список ее содержимого, но RM был не в состоянии удалить его. Что'ы, как правило, не проблема, так как ПМ бы снять less, чем то, что было показано с помощью команды ls.

Большая проблема здесь исходит от запуск команды ls * или РМ * в каталог, содержащий имена файлов, начинающиеся с тире. Они будет расширяться на командные строки две программы, как если бы вы написали их сами, и команды ls бы означает, что "обратный порядок сортировки-то", а РМ бы означает рекурсивное удаление. Разница имеет значение, если у вас есть поддиректории не менее двух уровней в глубину. (командыls * покажет содержание первого каталогах уровне, но РМ -Р *` Все прошедшие первый подуровень, тоже.)

Чтобы избежать этого, напишите разрешительной шарики с ведущим ./ чтобы указать текущий каталог и/или поставить--, чтобы сигнализировать о конце варианта обработки до Глоб (т. е. РМ ./` или РМ -- `).

С Глоб, как *.тхт, что'ов на самом деле не является большой проблемой, поскольку точка-это недопустимый символ, и приведет к ошибке (пока кто-то расширяет ЖКХ придумывать смысл для него), но это's по-прежнему безопаснее ставить ./ в любом случае есть.


Конечно, вы также можете получить разные результаты для двух команд, если вы поменяли раковину'ы подстановка вариантов, или создать/переместить/удалить файлы в различные команды, но я сомневаюсь, что ты имел в виду любого из этих случаев. (Работа с новыми/перемещении файлов будет крайне запутанна, чтобы сделать все безопасно.)

Комментарии (3)

Оставляя в стороне оболочки поведение,пусть'ы сосредоточиться на только что РМ и лс не могу бороться с собой. По крайней мере один случай, когда команды ls покажет, что РМ может't снимите включает в себя разрешения для каталогов, и другой - специальные каталоги . и ...

Папки разрешения ###

РМ - это операция на каталог, потому что, удалив файл, вы'вновь меняется содержимое каталога ( или другими словами список каталогов статей,так как Directory это не более чем список имен файлов и индексных дескрипторов). Это означает, что необходимо разрешение на запись в каталог. Даже если вы являетесь владельцем файла, без разрешения каталога вы можете'т удалить файлы. В наоборот: РМ может удалять файлы, которые могут принадлежать другим лицам, если вы владелец каталога.

Так вы можете очень хорошо иметь разрешения на чтение и выполнение для каталога, что позволит вам пройти каталог и просмотреть содержимое в просто отлично, например ЛС /ОГРН/эхо, но вы можете'т РМ /ОГРН/Эхо, если вы являетесь владельцем /ОГРН или повысить свои привилегии ссудо`.

И вы'увидишь таких случаях везде. Здесь's один такой случай: https://superuser.com/a/331124/418028


Специальные каталоги '.' и '..'

Другой особый случай . и каталоги... Если вы делаете общ. или LS .. , она с радостью покажет вам содержание, но ПМ'ки их не допускается:

$ rm -rf .
rm: refusing to remove '.' or '..' directory: skipping '.'
Комментарии (0)

Если вы вводите команды ls *, а затем РМ *, это's возможно, вы'МР удалить несколько файлов, чем команды ls показал - бы они ни были созданы в маленькой интервал времени между окончанием команды ls и РМ.

Комментарии (9)

команды ls * и РМ * не несет ответственности за расширения Глоб - что's выполнено оболочкой, прежде чем передать его в команду.

Это означает, что вы можете использовать любой команда с расширенным списком - поэтому я хотел бы использовать что-то, что делает как можно меньше.

Так что лучший способ, чтобы сделать это (или по крайней мере, другой способ), чтобы пропустить среднего человека.

Эхо * покажет вам точно, что будет в команде РМ.

Комментарии (2)

Если у вас только команды ls вместо Общ -а, да РМ может удалить скрытые файлы вы не'т видел ЛС без .

Пример :

По данным :

dir_test
├── .test
└── test2

неужели dir_test` : будут отображены только условие_2

ЛС -это dir_test : появится условие_2 + .тест

РМ -Р dir_test` : удалить всех (.тест + условие_2)

Я надеюсь, что вам поможет.

Комментарии (4)

Как насчет:

$ mkdir what
$ cd what
$ mkdir -p huh/uhm ./-r
$ ls *
uhm
$ rm *
$ ls
-r
$ ls -R
.:
-r

./-r:

В основном шаблоны расширения для материалов, начинающиеся с - (или ввести вручную вещи, начинающиеся с-, но это похоже больше на обман) может быть истолковано по-разному команды ls и РМ.

Комментарии (0)

Есть крайние случаи are, где какие команды ls показывает не то, что РМ удаляет. Довольно экстремальный, но, к счастью, доброкачественная это, если аргумент является символической ссылкой на директорию: Общ покажет вам все файлы, символические ссылки на них в каталоге, а РМ будет удалить ссылку, оставив оригинальный каталог и его содержимое нетронутыми:

% ln -s $HOME some_link
% ls some_link    # Will display directory contents  
bin    lib    Desktop ...
% rm some_link
% ls $HOME
bin    lib    Desktop ...
Комментарии (5)

Есть уже много хороших ответов, но я хочу добавить некоторые более глубокое понимание.

Задайте себе вопрос: сколько параметров передаются команды ls, если вы пишете

ls *

...? Обратите внимание, что команды ls не попасть * в качестве параметра, если есть какие-то файлы, которые * может быть расширена. Вместо этого оболочку сначала выполняется подстановка, то перед вызовом команды, поэтому команда ЛС на самом деле получает столько параметров, сколько там файлов соответствует подстановка. Для подавления подстановка, цитирую параметр.

Это верно для любой команды: Эхо * против Эхо &#39;*&#39;.

Есть скрипт, назовем его `countparams.sh чтобы проверить эффект. Он говорит вам, сколько параметров она прошла и перечисляет их.


#!/bin/bash
echo "This script was given $# parameters."
arr=( "$@" )
for ((i=0;i
Комментарии (0)

Шар будет расширяться одинаково оба раза, если содержимое каталога такие же на эти две разные эпохи.


Если вы действительно хотите проверить, что будет удален, используйте РМ -я *.тхт`. Он запросит отдельно для каждого файла до (пытается) удалить его.

Это гарантировано, чтобы быть безопасным против условий гонки: команды ls *.тхт / создается новый файл РМ/*.тхт потому что вы'повторно запрос на каждый файл по той же программе, что'работает на удаление.


Это слишком громоздко для обычного использования, а если псевдоним РМ в РМ -я, вы&#39;ll найти себя с помощью\РМ или РМ -Фдовольно часто. Но стоит хотя бы упомянуть, что есть решение для гонки. (Он&#39;s даже портативный номера-ГНУ систем: [РМ в POSIX(1)задает-я Вариант`] 1.)

Другим вариантом может быть массив Баш: to_remove=(*.тхт), а потом попросить пользователя подтвердить (возможно, после выполнения командыls -ЛД -- " и${to_remove[@]}"В), затем РМ -- " у${to_remove и quot [@]};. Так что расширение Глоб делается только один раз, и этот список передается дословно РМ.

Еще один практически-полезная опция РМ-я ГНУ `([страницы][2]), который запрашивает при удалении более 4 предметов. (Но не&#39;т показать вам список, только общая.) Я использую псевдоним РМ=&#39;РМ -я&#39; на моем рабочем столе.

Это's приятный гарантией от жира-мастурбация вернуться с пол-введенный шаблон, который слишком много. Но сначала с помощью команды ls в целом является удовлетворительным в каталоге вы владеете, или на однопользовательской системе, а когда нет'т фоновых процессов, которые могут асинхронно создать там новые файлы. Для защиты от жира, мастурбация, Дон'т типа РМ -РФ в /Foo/бар/базслева направо. РМ -РФ / - это специальный регистр, но РМ -РФ /УСР-разве&#39;т! Оставим за скобками-ВЧ часть, илиLS, и только добавить РМ -РФ часть после ввода пути.

Комментарии (0)