3 Stimmen

Bash-Typ "${i%.mp3}"-Syntax mit xargs verwenden?

Anwendungsbeispiel (erfunden!): Umbenennen von .mp3-Dateien in .txt.

Ich würde gerne etwas tun können wie

find -name '*.mp3' -print0 | xargs -0 -I'file' mv file ${file%.mp3}.txt

Das funktioniert nicht, also habe ich auf Piping zurückgegriffen find Ausgabe durch sed -e 's/.mp3//g' Das ist der Trick.

Das wirkt allerdings ein bisschen hakelig; gibt es eine Möglichkeit, die übliche bash ${x%y} Syntax?

2voto

hlovdal Punkte 24350

Nein, xargs -0 -I'file' mv file ${file%.mp3}.txt wird nicht funktionieren, weil die file Variable wird vom Programm xargs und nicht von der Shell expandiert. Eigentlich ist es nicht ganz korrekt, sie als Variable zu bezeichnen, im Handbuch von xargs wird sie "replace-str" genannt.

Update: Um nur xargs und bash (und kein sed oder ähnliches) zu verwenden, können Sie natürlich xargs einen bash-Prozess starten lassen, der dann jede beliebige Ersetzung vornehmen kann:

find -name '*.mp3' -print0 | xargs -0 bash -c \
'while [ -n "$1" ]; do mv "$1" "${1%.mp3}.txt" ; shift; done;' "bash"

1voto

Ole Tange Punkte 1934

Wenn Sie GNU Parallel installiert haben:

find -name '*.mp3' -print0 | parallel -0 mv {} {.}.txt

Wenn Ihre Dateinamen keine \n (Zeilenumbruch) funktioniert auch dies:

find -name '*.mp3' | parallel mv {} {.}.txt

Sehen Sie sich das Einführungsvideo an, um mehr über GNU Parallel zu erfahren http://www.youtube.com/watch?v=OpaiGYxkSuQ

1voto

tripleee Punkte 155951

Nur um einen weiteren Vorschlag hinzuzufügen, auch wenn er nicht den Ersetzungsmechanismus der Shell, sondern den von sed verwendet.

find -name '*.mp3' -print |
sed -e 's/\.mp3$//' -e "s/.*/mv '&\.mp3' '&\.txt'/" |
sh

Mit anderen Worten: Erstellen Sie eine mv Befehlszeile für jeden Dateinamen, und übergeben Sie das Ergebnis an sh .

Dies schlägt fehl, wenn eine der Dateien ein Apostroph (einfaches Anführungszeichen) in ihrem Dateinamen enthält. Ich schreibe dies hauptsächlich, um dem "Wenn man nur xargs hat, sieht jedes Problem wie ein Nagel aus"-Syndrom entgegenzuwirken.

Nicht alleeds haben genau die gleiche Syntax. Insbesondere bin ich mir nicht 100%ig sicher, ob man unter einem alten SunOS mehrere -e Argumente haben kann (suchen Sie nach dem XPG-kompatiblen sed in etwas wie /usr/ucb/blah/barf/vomit/xpg4/bin/sed )

0voto

ghostdog74 Punkte 305138
find . -type f -name '*.mp3' | while read -r F
do
  mv "$F" "${F%.mp3}.txt"
done

Bash 4+

shopt -s globstar
shopt -s nullglob
for file in **/*.mp3
do
    mv "$file" "${file%.mp3}.txt"
done

0voto

Michael Campbell Punkte 1977
perl rename.pl 's/\.mp3$/.txt/' *.mp3  
# Or **/*.mp3 for zsh and bash with specific settings set, for a recursive 
# rename.

http://people.sc.fsu.edu/~jburkardt/pl_src/rename/rename.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X