использование xargs передача аргументов в Sub shell с помощью pipe

Я хочу переименовать несколько файлов. Думаю, я могу использовать для этого 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  $(echo  | cut -d"-" -f-2)" "{}"
5
задан nelaaro
источник

1 ответов

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

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

хитрый бит преобразования замены xargs -I {} строка в аргументы для команды xargs sh -c ....

Я сделал это, поставив аргумент без вариантов -, в конце команды перед строкой замены {}.

таким образом, моя команда xargs следующая.

sh -c 'mv "" $(echo {} | cut -d"-" -f-2)' - {}

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

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

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

https://explainshell.com

0
отвечен nelaaro 2018-06-27 07:38:53
источник

Другие вопросы bash command-line-arguments pipe sh xargs