2017-10-05 17 views
1

Ich habe ein Verzeichnis, das mehrere Dateien und Verzeichnisse enthält. Ich möchte die Erweiterung .ext zu allen Dateien hinzufügen. Einige Dateien haben eine Erweiterung (verschiedene Arten von Erweiterungen) und einige Dateien haben keine Erweiterung.Wie kann ich die Erweiterung von Dateien in einem Verzeichnis hinzufügen und ändern?

Ich benutze Ububtu 16.04.

Ich habe mehrere Antworten gelesen, aber ich konnte sie nicht verstehen.

+0

Mit dem Befehl mv Wie in dieser Frage: https://stackoverflow.com/questions/6114004/add-file-extension-to-files-with- Bash –

+0

Es funktioniert nicht. –

+1

"Es funktioniert nicht" Ist überhaupt nicht hilfreich .... WAS "funktioniert nicht"? Tut es dumme Sachen? Wirft es Fehler auf Sie? Wie hast du es versucht? Show code ... – Mischa

Antwort

1

In bash:

$ for f in * ; do if [ -f "$f" ] ; then t="${f%.*}" ; mv -i "$f" "$t".ext ; fi ; done 

Erklärt:

for f in *    # loop all items in the current dir 
do 
    if [ -f "$f" ]   # test that $f is a file 
    then 
    t="${f%.*}"   # strip extension off ie. everything after last . 
    mv -i "$f" "$t".ext # rename file with the new extension 
    fi 
done 

Test:

$ touch foo bar baz.baz 
$ mkdir dir ; ls -F 
bar baz.baz dir/ foo 
$ for f in * ; do if [ -f "$f" ] ; then t="${f%.*}" ; mv -i "$f" "$t".ext ; fi ; done 
$ ls 
bar.ext baz.ext dir/ foo.ext 

Einige Überschreibung, wenn zum Beispiel passieren könnte; Es gibt Dateien foo und foo.foo. Deshalb habe ich den -i Schalter zu der mv hinzugefügt. Entfernen Sie es, sobald Sie verstehen, was das obige Skript tut.

+0

Es wird eine Erweiterung zu a hinzugefügt Verzeichnis (nur Problem übrig) auch das will ich nicht machen. Es fügt die Erweiterung korrekt zu Dateien hinzu, die zuvor eine Erweiterung hatten. Ich habe das Verzeichnis in der Frage früher verpasst und habe es jetzt bearbeitet. Das tut mir leid. –

+0

Wird '%' verwendet, um alles nach '.' . –

+0

'%. *' Bedeutet, die letzte Periode und alles danach abzustreifen. Das könnte auch ein Problem verursachen, wenn Sie eine Datei ohne Endung haben, die einen Punkt im Namen 'like.this' vs.' or.this.txt' enthält. –

0

Ist das, was Sie benötigen:

find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS=".";ext=".png"}{system("mv "$0" ./"$1ext"")}' 

[[email protected] check]# ls -lrt 
total 0 
-rw-r--r--. 1 root root 0 Oct 5 08:08 abc 
-rw-r--r--. 1 root root 0 Oct 5 08:08 hello.txt 
-rw-r--r--. 1 root root 0 Oct 5 08:08 something.gz 
[[email protected] check]# find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS=".";ext=".png"}{system("mv "$0" ./"$1ext"")}' 
[[email protected] check]# ls -lrt 
total 0 
-rw-r--r--. 1 root root 0 Oct 5 08:08 abc.png 
-rw-r--r--. 1 root root 0 Oct 5 08:08 hello.png 
-rw-r--r--. 1 root root 0 Oct 5 08:08 something.png 
+0

nur einfache awk Befehle. Sollte einfach zu verstehen sein –

Verwandte Themen