Mit xargs übergeben Sie Argumente an die Sub-Shell mit Pipe

809
nelaaro

Ich möchte einige Dateien umbenennen. Ich denke, ich kann xargs dafür benutzen.

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 

Ich versuche folgendes, aber es scheint nicht zu funktionieren

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

1 Antwort auf die Frage

0
nelaaro

Das macht, was ich brauche

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

Das schwierige Bit war das Konvertieren der xargs-Ersatzzeichenfolge -I {}in Argumente für den Befehl xargs sh -c ....
Ich tat dies, indem ich -am Ende des Befehls vor dem Ersetzungsstring ein Argument ohne Option setzte {}.

Also mein Befehl an xargs ist der folgende.
sh -c 'mv "$1" $(echo {} | cut -d"-" -f-2)' - {}

Ich habe damit getestet, was ich wollte, bevor ich den Move-Befehl ausführte

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

Ich fand diese Seite hilfreich, um zu verstehen, wie man dieses Problem löst

https://explainshell.com