Rekursives umbenennen von Dateien und entfernen Sie ein Zeichen
Gibt es einige Datei-Namen enthalten '?'
Wie Sie wissen, windows hat problem mit solchen Charakteren. Ich möchte rekursiv umbenennen alle Dateien in den Ordnern mit xarg
. Zum Beispiel
09 - grand hall?_10.mp3
sollte
09 - grand hall_10.mp3
- während Sie gerade dabei sind, wollen Sie Leerzeichen entfernen?
- es ist nicht schlecht. Was dann zu tun?
- und nicht die Lösung haben, verwenden
xarg
? - haben die Verzeichnisse, die Leerzeichen enthalten oder
?
? - Ich weiß es nicht. Ich dachte, ich habe mit xargs
Du musst angemeldet sein, um einen Kommentar abzugeben.
for file in $(find folder -name '*.mp3'); do
mv -v "$file" $(echo "$file" | tr ? _);
done
Den oben genannten whitespace-Probleme; das ist besser:
find folder -name '*.mp3' -exec echo "'{}'" \; |
while read file; do
echo -n "mv -v $file " && echo $file | tr ? _;
done | sh
Die Idee ist, sich alle Dateien finden, dann echo Sie in Anführungszeichen gesetzt werden. Leiten Sie die Ausgabe in eine
while
- Schleife, die Konstrukte einermv
Befehl für jede Datei, und dann Rohr , dass in eine neue shell.Hässlich, aber wenn Sie nicht wie die Antwort, Sie sollten sich nicht die Frage gestellt. 🙂
$file
in diesem, aber es ist immer noch re-tokenisierung Probleme mitfor file in $(find _folder_ -name '*.mp3')
. Möchten Sie vielleicht versuchen, etwas basierend auf einemfind -print0
an eineread -d ''
null
Abgrenzung. Sie haben auch eingeführt, ein code-execution-Problem, da konnte ich einen Dateinamen wie 'file$(my code to run)name
', und dein Rohr zu sh wird am Ende läuftmy code to run
!sh
, das ist fast immer eine schlechte Idee. Verwendenfind ... -print0
drucken Sie die Dateinamen getrennt durch null-bytes. Dann Rohr, das zu einemwhile read -d '' filename; do ...; done
Schleife. Die-d ''
macht dieread
verwenden Sie null-byte-Begrenzung.Dies ist furchtbar hässlich, aber ich nahm es als eine persönliche Herausforderung zu finden, die einen one-liner, die funktionieren würde. 🙂
find folder -name '*.mp3' -exec \
sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh
Die Strategie ist, die Dateien zu finden, verwenden Sie
echo
zu konstruierenmv
Befehl für jede Datei mit seinem Namen in Anführungszeichen, und dann leiten Sie die Ausgabe in eine shell.Dieser Einzeiler sollte funktionieren, selbst wenn die Dateinamen enthalten Einzel - /Doppel-Anführungszeichen und Leerzeichen:
Erklärung:
find
nur Dateien suchen, deren Namen enthalten '?'\0
als Trennzeichen inIFS
,find
(von-print0
) undread
(von-d ''
) verarbeiten kann Dateinamen mit Sonderzeichen wie Anführungszeichen, doppelte Anführungszeichen, Leerzeichen, etc.IFS
intakt..
im Skript ersetzt werden könnte durch jedes beliebige andere Verzeichnis.