Невозможно передать указанную строку в rm напрямую с помощью xagrs - PullRequest
0 голосов
/ 14 мая 2019

Чтобы найти файл с помощью grep и удалить его с помощью rm Я попытался выполнить следующую команду -

$ ls | grep 2019 | xargs -i rm \"{}\"

Это не сработало.Получил следующее сообщение об ошибке -

rm: cannot remove '"2019-05-10 00:00:00-TO-2019-05-10 23:59:59_PDT_disconnection_info.csv"': No such file or directory

Похоже, xargs буквально принимает кавычки.Итак, попробовал echo ing вместо прямой передачи -

ls | grep 2019 | xargs -i echo \"{}\" | xargs rm

Это сработало.

Почему не работает без echo ing?

1 Ответ

1 голос
/ 14 мая 2019

Правильное цитирование выполняется с помощью xargs, нет необходимости заключать его в кавычки.Просто:

 ... | xargs -i rm {}

Или лучше, потому что rm принимает несколько аргументов, просто сделайте:

 ... | xargs rm

Почему это не работает без эха?

Когда не используется с -i, -I, -d или аналогичным, утилита xargs обрабатывает правильные кавычки при вводе с двойными или одинарными кавычками или экранирование с обратной косой чертой.Кавычки удаляются вторым xargs и rm передается без кавычек.От man xargs :

 .... xargs reads
 items from the standard input, delimited by blanks (which can be
 protected with double or single quotes or a backslash)

Сравните:

$ echo "\e\r\t\q\e" | xargs -t echo
echo ertqe 
ertqe

См. Также Почему вы не должны анализировать выводLs (1) .

...