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?


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

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/' *

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...

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

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/ *

6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;

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.


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

--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


-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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.