Назад | Перейти на главную страницу

xargs удаляет имя файла, содержащее $

Я использую 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'"

и он отлично работает, потому что:

man bash:

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

Заключение символов в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением $, , \, and, when history expansion is enabled, !. The characters $ and сохраняют свое особое значение в двойных кавычках.