2016-05-19 10 views
1

Angenommen, ich habe Dateien mit dem Namen "*.data.done". Jetzt möchte ich sie (rekursiv) umbenennen zurück zu „* .data“, dann diejenigen, die also hier "pattern"Zeichen aus Xargs streichen {} in bash

enthält we go:

grep -l -R -F "pattern" --include '*.data.done' * | xargs -I{} mv {} ${{}::-5} 

Nun, das Strippen von ‚DONE‘ funktioniert nicht (bash 4.3.11):

bash: ${{}::-5}: bad substitution 

Wie kann ich das am einfachsten machen?

+0

ich ein kleines Skript erstellen würde: 'für Datei in "$ @"; Mach mv "$ file" "$ {file% .done}"; in einer Datei 'moveit.sh' und dann' xargs sh moveit.sh'. Es ist einfach und das Bereinigen der 'moveit.sh' Datei ist kein großer Aufwand. –

+0

'{}' ist keine Shell-Variable, Sie können keine Shell-Parameter-Erweiterung darauf ausführen. – 123

Antwort

3

Platzhalter {} kann nicht in BASHs String-Manipulationen innerhalb ${...} verwendet werden.

können Sie verwenden:

grep -lRF "pattern" --include '*.data.done' . | 
xargs -I{} bash -c 'f="{}"; mv "$f" "${f/.done}"' 

Allerdings, wenn Sie Laich Subshell vermeiden wollen für jede Datei dann eine Schleife für verwenden:

while IFS= read -d '' -r f; do 
    mv "$f" "${f/.done}" 
done < <(grep -lRF "pattern" --include '*.data.done' --null .)