Verzeichnisse umbenennen, die das linke/rechte Quadrat enthalten

Verzeichnisse umbenennen, die das linke/rechte Quadrat enthalten

Um Verzeichnisse mit linken und rechten Quadraten umzubenennen, können Sie Folgendes verwenden:

shopt -s globstar 
rename -n 's/\(|\[|\]|\)//g' **

Dadurch wird alles mit [ & ] aus dem Verzeichnis, in dem Sie sich befinden, rekursiv umbenannt.

aber ich muss dies als nemo.action-Skript ausführen und bekomme es nicht zum Laufen. (Im Grunde ein normales Bash-Skript)

Mein aktuelles Skript ist:

#!/bin/bash
shopt -s globstar 

rename  "$@" 's/\(|\[|\]|\)//g' **

wo $@ist/media/sf_Mediaserver3/Untitled Folder/[ hdjue] [kskk]

bei dem die[ hdjue] [kskk] (nur zufällige Buchstaben)ist der Startordner, den ich umbenennen möchte, und die folgenden Dateien/Ordner ...

Das funktioniert natürlich nicht und jetzt muss ich in das übergeordnete Verzeichnis gehen und die ersten Zeilen ausführen, aber dadurch würden ALLE Verzeichnisse im übergeordneten Verzeichnis verarbeitet, nicht nur das. [ hdjue] [kskk] Hat jemand eine Idee, wie man das lösen kann?

es scheint fast so, als ob die Umbenennungsfunktion mit einem Startverzeichnis nicht umgehen kann?

Entfernen Sie nach Möglichkeit alle Leerzeichen (ersetzen Sie sie durch . (Punkt)) und schreiben Sie den Dateinamen/das Verzeichnis in Kleinbuchstaben, um die Kompatibilität mit externen/internen Anforderungen zu vereinfachen.

Antwort1

Die Anforderung hier besteht, so wie ich es verstehe, darin, alle Vorkommen der Zeichen [und ]aus Dateien und Verzeichnissen an und unter den angegebenen Pfaden zu entfernen.

Die Schwierigkeit besteht darin, das Umbenennen des Verzeichnisses zu vermeiden, während es noch durchsucht wird. Der Globstar **listet Elemente von der Wurzel abwärts auf, anstatt zuerst in der Tiefe. In einem Beispiel wie bedeutet a a/b a/b/cdas Umbenennen, dass die Pfade zu und nicht mehr gültig sind. Die Option kann dies mit ihrem umgehen , aber das erfordert einen anderen Ansatz.aa/ba/b/cfind-depth

#!/bin/bash
#
find "$@" -depth -name '*[[\]]*' -print0 |
    while IFS= read -d '' -r item
    do
        path="${item%/*}" file="${item##*/}"    # Separate path and file name parts
        name="${file//[[\]]/}"                  # Generate new file name
        name="${name// /.}"                     # Comment: space becomes dot
        name="${name,,}"                        # Comment: lowercase name

        echo mv -f "$item" "$path/$name"        # Rename
    done

Entfernen echo(oder ergänzen) Sie es, wenn Sie zufrieden sind, dass das Skript das erwartete Verhalten zeigt.

Ich habe es -print0in Verbindung mit der -d ''Option für verwendet read, um Dateien mit wirklich seltsamen Dateinamen zu verarbeiten (einschließlich solcher mit Zeilenumbrüchen und nicht druckbaren Zeichen). Sie können beide entfernen, wenn Sie sehen möchten, was passiert – oder wenn Ihre Implementierungen sie nicht unterstützen –, aber das Skript wird dann weniger robust

Die Modifikatoren beim Zuweisen der Variablen path, file, und namewerden mit Globs (nicht mit regulären Ausdrücken) abgeglichen. Ein einzelner Modifikator ( %, #, /) bedeutet eine kürzeste oder einzelne Übereinstimmung; ein doppelter Modifikator ( %%, ##, ) bedeutet eine längste Übereinstimmung oder mehrere Übereinstimmungen. Es ist alles in der Manpage //dokumentiert, aber hier ist meine Erklärung mit Kontext:bash

  • ${item%/*}Das %zeigt an, dass diekürzesteÜbereinstimmung mit dem Glob-Muster sollte aus demEndedes Wertes von $item. Also a/b/cwürden wir den passenden Text entfernen /*und übrig lassena/b
  • ${item##*/}Das ##zeigt an, dass dieam längstenÜbereinstimmung mit dem Glob-Muster sollte aus demAnfangdes Wertes von $item. Also a/b/cwürden wir den passenden Text entfernen */und übrig lassenc
  • ${file//[[\]]/}Das //zeigt an, dassmehrereErsetzungen des Globs sollten durch den Text ersetzt werden, der dem nächsten folgt /, also nichts. Der Glob ist eine in eckige Klammern gesetzte Sammlung der beiden Zeichen [und ], was "entweder [oder ]" bedeutet. Für würden wir also ab[cd]ef[ghmit enden:abcdefgh

verwandte Informationen