В идеале я бы хотел такую команду
rm --only-if-symlink link-to-file
потому что я слишком часто сжигал себя, удаляя файл вместо символической ссылки, указывающей на файл. Это может быть особенно плохо, когда задействован sudo. Теперь я, конечно, делаю, ls -al
чтобы убедиться, что это действительно символическая ссылка и тому подобное, но она уязвима для ошибок оператора (файл с таким же именем, опечатка и т. Д.) И условий гонки (если кто-то хочет, чтобы я удалил файл по какой-то причине). Есть ли способ проверить, является ли файл символической ссылкой, и удалить его, только если он находится в одной команде?
bash
command-line
rm
Shelvacu
источник
источник
Ответы:
источник
!
и изменить||
на&&
||
форме.&&
сбивает вещи, если вы находитесь вset -e
режиме.[ ! -L $1 ]
), с использованием недопустимого оператора ([ ! -l foo ]
), или даже синтаксическая ошибка ([ ! -q foo || echo foo
)rm_if_link(){ [ -L "$1" ] && rm -v "$1"; }
том, что запуск его вset -e
режиме без ссылки в режиме убьет ваш процесс оболочки. Вы можете добавить,|| :
но тогда, IMHO, это станет еще менее понятным, чем! ||
версия, и это предотвратитrm
неудачуset -e
, которая вас убьет , что, вероятно, нежелательно.! ||
довольно кратко и ясно, и не страдает ни от одной из этих проблем.rm
внутреннюю часть вашего теста, б) использовать фактическое выражение if, в) не использовать-e
внутри интерактивных оболочек (и тестировать свои сценарии!). Если вы хотите поспорить о читабельности, то использованиеif
для проверки, является ли ссылка какой-то ссылкой, явно выигрывает.Вы можете использовать
find
и его-type l
условие теста (который проверяет , является ли объект найден является л чернил или нет)Например, если у вас есть файл с именем
foo
в текущем каталоге, вы можете сделать это:Вы можете упростить это с помощью всего лишь:
Что бы удалить все символические ссылки в текущем каталоге.
Предупреждение:
-delete
Вариант вfind
действительно очень опасно. ОБЯЗАТЕЛЬНО РАЗМЕСТИТЕ ЭТО В КОНЦЕ НАЙТИ КОМАНДУ. Если вы его не поместите, он удалит все, что найдет, независимо от того, соответствуют ли результаты вашему условию.Как предлагается в комментариях, более безопасным вариантом может быть использование
find
иrm -i
(что заставляет вас подтвердить удаление файла) в сочетании:Лично я использую
-exec trash {} \;
для временного удаления файлов, потому что я, как и вы, был сожженrm
в прошлом. Двойник идет за неуместный-delete
флаг.http://slackermedia.ml/trashy
источник
find . -type l -iname "foo" | xargs rm -i
это безопаснее.rm -i
Для безопасности, конечно.-print0
дляfind
и-0
дляxargs
.@
является классификатором глобуса ; шаблонfoo(@)
соответствует томуfoo
, что соответствует, но только символические ссылки.foo(-@)
будет соответствовать только неработающим символическим ссылкам.foo(@,L0)
будет соответствовать только символическим ссылкам и пустым файлам.Конечно, если вы запускаете zsh, вам просто нужно набрать
rm foo(@)
. Вы должны позаботиться о том, чтобы не нажимать Enterперед вводом(@)
.источник