Я использую xargs для удаления файлов с удаленного сервера.
xargs -a /var/log/del.log -i -exec ssh root@abc.com 'rm -rf "{}"'
del.log
содержит путь к файлам, которые были удалены на локальном сервере, и я хочу удалить их на удаленном сервере. Все работает нормально, но проблема начинается, когда это временный офисный файл, например ~$excel.xlsx
когда происходит такое именование файлов, xargs делает команду похожей на.
ssh root@abc.com 'rm -rf "~.xlxs"' - which is wrong,
Должно получиться - ssh root@abc.com 'rm -rf "~$excel.xlxs"'
Почему xargs так поступает? Может быть, xargs исключает его как переменную. Мне нужны решения, пожалуйста.
Или есть лучший способ удалить файлы с удаленного сервера? При условии, что на локальном сервере есть список путей, которые необходимо удалить на удаленном.
Оболочка интерпретирует слово, следующее за $
подписать и предшествовать .
как переменная. Поскольку $excel
не задан как переменная и не как переменная среды, оболочка заменяет его пустой строкой. Так
~$excel.xlxs ==> ~.xlxs when you replace the variable with an empty string.
Чтобы исправить это, перед знаком доллара нужно поставить escape character \
-
rm -rf ~\$excel.xlsx
xargs -a /var/log/del.log -i -exec ssh root@abc.com 'rm -rf "{}"'
Поменяйте местами одинарные кавычки и двойные кавычки:
xargs -a /var/log/del.log -i -exec ssh root@abc.com "rm -rf '{}'"
тогда команда будет расширена до:
ssh root@abc.com "rm -rf '~$excel.xlxs'"
и он отлично работает, потому что:
Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа внутри кавычек. Одиночные кавычки не могут находиться между одинарными кавычками, даже если им предшествует обратная косая черта.
Заключение символов в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением $,
, \, and, when history expansion is enabled, !. The characters $ and
сохраняют свое особое значение в двойных кавычках.