
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/c
das Umbenennen, dass die Pfade zu und nicht mehr gültig sind. Die Option kann dies mit ihrem umgehen , aber das erfordert einen anderen Ansatz.a
a/b
a/b/c
find
-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 -print0
in 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 name
werden 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
. Alsoa/b/c
wü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
. Alsoa/b/c
wü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 alsoab[cd]ef[gh
mit enden:abcdefgh