с помощью xargs передайте аргументы в sub shell с pipe

751
nelaaro

Я хочу переименовать ряд файлов. Я думаю, что могу использовать xargs для этого.

find ./ -name "upload.log-*"  ./upload.log-20180622.gz-20180624.gz-20180626.gz ./upload.log-20180624.gz-20180626.gz ./upload.log-20180620.gz-20180622.gz-20180624.gz-20180626.gz ./upload.log-20180621.gz-20180623.gz-20180625.gz-20180627.gz  find ./ -name "upload.log-*" -print | cut -d"-" -f-2 ./upload.log-20180622.gz ./upload.log-20180624.gz ./upload.log-20180620.gz ./upload.log-20180621.gz 

Я пытаюсь следующее, но это не похоже на работу

find ./ -name "upload.log-*" | xargs -I '{}' sh -c "echo $1 $(echo $1 | cut -d"-" -f-2)" "{}" 
0

1 ответ на вопрос

0
nelaaro

Это делает то, что мне нужно сделать

find ./ -name "cleanup.log-*" | xargs -I '{}' sh -c 'mv "$1" $(echo {} | cut -d"-" -f-2)' - {} 

Сложно было преобразовать строку замены xargs -I {}в аргументы команды xargs sh -c ....
Я сделал это, поместив аргумент no option -в конец команды перед строкой замены {}.

Таким образом, моя команда xargs следующая.
sh -c 'mv "$1" $(echo {} | cut -d"-" -f-2)' - {}

Я использовал это, чтобы проверить, что я хотел до запуска команды перемещения

find ./ -name "upload.log-*" | xargs -I '{}' sh -c 'echo "$1" $(echo {} | cut -d"-" -f-2)' - {} 

Я нашел этот сайт полезным в понимании, как решить эту проблему

https://explainshell.com