Was ist der gute Weg, um Dateierweiterungen ".jpg" zu erweiterungslosen Dateien mit bash hinzuzufügen?
Was ist der gute Weg, um Dateierweiterungen ".jpg" zu erweiterungslosen Dateien mit bash hinzuzufügen?
Antworten:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
"${f%.jpg}"ist Bash Shell String Manipulation. `$ {string% substring}` Löscht die kürzeste Übereinstimmung von $ substring von der Rückseite von $ string.
.jpgsogar zu normalen Dateien beiträgt.
Sie können die Umbenennung verwenden:
rename 's/(.*)/$1.jpg/' *
rename from to file...
Ein anderer Weg - ohne Schleifen
find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep 'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg
Nervenzusammenbruch:
Der obige Befehl ist für den Trockenlauf. Danach sollten Sie das "Echo" vor mv entfernen
BEARBEITEN Einige Leute schlagen vor, dass hier "Zeilenargumente in Anführungszeichen setzen; Argumentaufteilung auf Pfaden mit Leerzeichen vermeiden" erforderlich sind .
Normalerweise ist diese Empfehlung wahr, in diesem Fall nicht. Denn hier %wird das nicht durch die Shell-Erweiterung ersetzt, sondern durch das xargsinterne (direkt), so dass das %auch bei Leerzeichen in Dateinamen korrekt ersetzt wird.
Einfache Demo:
$ mkdir xargstest
$ cd xargstest
# create two files with spaces in names
$ touch 'a b' 'c d'
$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths
#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext
$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...
Einfach, CD in das Verzeichnis, in dem sich Ihre Dateien befinden und:
for f in *;do mv $f $f.jpg;done
for f in *;do mv "$f" "$f".jpg;doneLeerzeichen in Dateinamen unterstützt würden.
In meinem Fall war mir der Dateityp nicht bekannt, daher habe ich den Befehl mv mit Hilfe des Befehls file verwendet , um den Dateityp zu untersuchen und möglicherweise zu finden. Diese Lösung ist möglicherweise nicht für alle Dateien perfekt, da der Befehl file den Dateityp möglicherweise nicht erkennt, aber für mich meistens gut funktioniert hat.
for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done
Mit awk wird das zweite Wort der Zeichenfolge entfernt, die aus der Befehlsdatei zurückgegeben wird , die eigentlich die Erweiterung ist.
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
--dry-runund -asind in meiner Version von nicht verfügbar rename. Wenn dies für eine bestimmte Architektur spezifisch ist, sollte dies angegeben werden.
Sie können mehrere Dateien verschieben . Ich bin ein Betreuer dieses Projekts. Die Syntax ist einfach.
mmf files*
Es öffnet Ihren $ EDITOR mit allen Dateinamen oder vim standardmäßig und Sie können einfach das Ende aller Dateinamen mit Strg + v + G in vim markieren, die Datei speichern, beenden und alle Ihre Dateien umbenennen
Ryan Li
Die richtige Syntax zum Hinzufügen einer Dateierweiterung zu mehreren Dateien in einem Verzeichnis, die keine Dateierweiterung haben, lautet
find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then mv "$FILE" "$FILE".eml; fi; done;
mv "${file}" "${file}.jpg"?