Fügen Sie Text an Dateinamen hinzu, die keinen Punkt enthalten


9

Angesichts der folgenden Dateien:

english_api
english_overview
style.css

Ich möchte bekommen:

english_api.html
english_overview.html
style.css

Mit anderen Worten, wie Sie einen Text an alle Dateien anhängen, die keinen Punkt ( .) in einem Verzeichnis enthalten, indem Sie das Terminal verwenden.

Offensichtlich befinden sich viele Dateien in diesem Ordner. Ich habe gerade 3 als Beispiel geschrieben.

Wenn ich zu, sagen wir, ersetzen Sie .cssmit .htmlin diesem Ordner, würde ich verwenden:

rename .css .html *.css

Aber ich kann mir nicht wirklich vorstellen, wie ich Dateien abgleichen kann, die nichts enthalten. Auch wie man mit renameBefehl anhängt (vs ersetzt) ?

Antworten:


13

Versuchen Sie diesen findBefehl,

find . -type f ! -name "*.*" -exec mv {} {}.html \;

Es benennt die Dateien , die nicht enthalten Punkte , die in ihren Dateinamen im aktuellen Verzeichnis zu diesem präsentieren filename.htmlFormat ( hinzugefügt .htmlam letzten ).

. -> Repräsentiert das aktuelle Verzeichnis

-type f -> Diesen Vorgang nur für Dateien ausführen.

! -name "*.*" -> gibt den Namen der Dateien aus, deren Name keine Punkte enthält.

-exec mv {} {}.html -> findBefehl führt diese Verschiebungs- (oder) Umbenennungsoperation für die extrahierten Dateinamen aus.

\; -> Stellt das Ende des findBefehls dar.


6

In Bash können Sie erweiterte Shell-Globs verwenden, z

for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done

(Entfernen Sie das, echosobald Sie bestätigt haben, dass es mit dem richtigen Muster übereinstimmt.) Wenn Extended Globbing noch nicht aktiviert ist, können Sie es mit aktivieren shopt -s extglob.

Eine andere Option ist die Verwendung der Perl-basierten renameFunktion mit einem regulären Ausdruck, der das Literal ausschließt.

rename -nv 's/^[^.]+$/$&.html/' path/to/files/*

(Entfernen Sie die nOption, sobald Sie bestätigt haben, dass sie mit dem richtigen Muster übereinstimmt.)


for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; doneBefehl benennt auch die Verzeichnisse um.
Avinash Raj

2

Ich bevorzuge in solchen Fällen mmv. Es ist nicht standardmäßig in Ubuntu installiert, aber Sie können es mit dem sudo apt-get install mmvBefehl installieren .

In Ihrem Fall müssen Sie es zweimal verwenden:

  1. Benennen Sie alle Dateien aus dem aktuellen Verzeichnis um, indem Sie .htmlam Ende jedes Dateinamens Folgendes hinzufügen :

    mmv -v '*' '#1.html'
    
  2. Benennen Sie alle Dateien, deren Namen zuvor einen oder mehrere .(Punkte) enthielten, erneut um (zurück ):

    mmv -v '*.*.html' '#1.#2'
    

Oder in einer Zeile:

mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'

-vOption ist nicht obligatorisch. Ich benutze es nur für eine ausführliche Ausgabe, weil es ohne es mmvAktionen still ausführt.

Siehe man mmvfür weitere Informationen.


1

Mit dem Perl-Umbenennungsbefehl ( prename) können Sie eine Bedingung hinzufügen, dass der Dateiname einen Punkt enthalten muss. Wenn das Perl-Snippet den Namen einer Datei nicht ändert, bleibt diese Datei unberührt. Hier sind einige Möglichkeiten, dies zu schreiben:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *

-2

Die Antworten sind perfekt, ich gebe Ihnen auch einen anderen Befehl, der diesen Job macht:

ls -1 | grep -v "\." | awk '{print "mv "$0" "$0".html"}' | sh

Einige Erklärungen:

ls - list directory contents

 -1     list one file per line

grep prints the matching lines.

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.

HINWEIS :

Ich probiere dein Szenario aus und der Befehl macht den Job.


6
Dies schlägt bei Dateinamen fehl, die beliebige Leerzeichen enthalten (Leerzeichen, Tabulatoren, Zeilenumbrüche usw.). In der Regel sollten Sie niemals analysierenls .
Terdon

Das ist richtig, terdon, danke für deinen Kommentar, aber wie kann ich das im selben Befehl lösen
nux

3
Das kannst du nicht wirklich. Es gibt fast keinen sicheren Weg , ls zu analysieren. Wenn Sie es wirklich mit awkund tun möchten sh, versuchen Sie etwas wie printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Das wird bei Dateinamen mit Zeilenumbrüchen immer noch kaputt gehen, aber es kann zumindest mit Leerzeichen umgehen. Das --ist für den Fall erforderlich , in denen Sie die Dateinamen beginnend mit haben -.
Terdon
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.