Fügen Sie Dateien mit bash eine Dateierweiterung hinzu

92

Was ist der gute Weg, um Dateierweiterungen ".jpg" zu erweiterungslosen Dateien mit bash hinzuzufügen?

Adrian
quelle
3
mv "${file}" "${file}.jpg"?
onteria_
2
Was ist aus Ihrer Sicht eine "Datei ohne Erweiterung"? Ist es eine Datei ohne einen Punkt im Namen?
Glenn Jackman

Antworten:

115
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
Seth Robertson
quelle
8
Die zweite ist perfekt zum Umbenennen von Dateien ohne Erweiterung! Vielen Dank!
anon58192932
2
Die zweite fügt eine Erweiterung für alle Dateien hinzu, nicht nur für die ohne Erweiterung
Jeff
5
Genau wie eine Notiz "${f%.jpg}"ist Bash Shell String Manipulation. `$ {string% substring}` Löscht die kürzeste Übereinstimmung von $ substring von der Rückseite von $ string.
Jichao
Warnung: Wenn Sie einen Ordner mit gemischten Erweiterungen haben, wissen Sie, dass das oben Genannte .jpgsogar zu normalen Dateien beiträgt.
Sachinruk
61

Sie können die Umbenennung verwenden:

rename 's/(.*)/$1.jpg/' *
Kim Stebel
quelle
3
Welche Version der Umbenennung verwenden Sie? Meins hat verschiedene Argumente:rename from to file...
B Johnson
1
Das Umbenennen ist in Perl enthalten, das Version 5.10.1 ist.
Kim Stebel
3
Dies funktioniert hervorragend mit der in Ubuntu enthaltenen Umbenennung (und daher schätze ich alle Debian-basierten Distributionen), viel weniger ausführlich als die Antwort von jm666.
Roger Heathcote
28

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:

  • Finde alle Dateien ohne Erweiterung
  • Überprüfen Sie den Dateityp
  • Filtern Sie nur JPG-Dateien heraus
  • Dateitypinformationen löschen
  • xargs führt das "mv" für jede Datei aus

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...
jm666
quelle
Sie können dies in eine Schleife setzen und diese Xargs sind überflüssig. Ich mag Ryans Antwort in dieser Situation besser.
Lucius
1
@ Lucius - übrigens, die Frage will "erweiterungslose" Dateien - also sollte Ryan nur diese finden ...
jm666
@ jm666 hey! Wie ändere ich Ihr Code-Snippet, um alle erweiterungslosen Dateien in einem Ordner in ihre jeweiligen Erweiterungen umzubenennen? (Ich
erkenne
24

Einfach, CD in das Verzeichnis, in dem sich Ihre Dateien befinden und:

for f in *;do mv $f $f.jpg;done
Bharath
quelle
Aus irgendeinem Grund funktioniert das für mich, aber Seths Lösung mit Anführungszeichen nicht. (OSX Mountain Lion Bash)
Delrocco
4
Wäre besser, wenn for f in *;do mv "$f" "$f".jpg;doneLeerzeichen in Dateinamen unterstützt würden.
Hritik
Vielen Dank für diese elegante und einfache Lösung. Ich bin mehrmals auf diese Antwort gestoßen, kann sie mir aber nicht merken. #dejavu
Tim Andersen
15

Probelauf:

 rename -n s/$/.jpg/ *

tatsächliche Umbenennung:

 rename s/$/.jpg/ *
Alexey
quelle
6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;
Ryan Li
quelle
1

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.

Paolo
quelle
behandelt jpg und png automatisch. hat es benutzt und funktioniert - vielen Dank! Erst jetzt sind Erweiterungen CAPS. kleines Problem aber :)
krivar
0
rename --dry-run * -a ".jpg" # test  
* -a ".jpg" # rename
Roman Rhrn Nesterov
quelle
--dry-runund -asind in meiner Version von nicht verfügbar rename. Wenn dies für eine bestimmte Architektur spezifisch ist, sollte dies angegeben werden.
Fernando César
0

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

Almas Abdrazak
quelle
-2

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;
Dillon Beresford
quelle