Linux Ordner automatisch umbenennen

Gast #7203182
Hallo

Ich möchte unter Linux in einem Verzeichnis gleichnamige Ordner, die 
sich nur durch Groß- bzw. Kleinschreibung unterscheiden, umbenennen 
lassen. Beispiel:

ordner
ORDNER
Ordner

Nach dem umbenennen:

ordner
ORDNER_001 (oder ähnlich)
Ordner_002 (oder ähnlich)

Das ganze dazu, damit unter Windows die Ordner korrekt angesprochen 
werden können. Kann hier jemand helfen?
Dazu müsstest du jedes Verzeichnis gegen jedes Verzeichnis vergleichen 
und zählen, am besten schreibst du erstmal alles in eine Indexdatei. Das 
ist zwar mit einem shell script schnell gemacht, wie lange das dann 
läuft hängt aber von deinen Daten ab.

Mir ist allerdings unverständlich wieso man seine Verzeichnisse 
überhaupt so benennt. Wenn das generierte Verzeichnisse sind, dann wäre 
es besser das an der Quelle zu korrigieren, statt hinterher aufzuräumen.
cp und mv können von Hause aus "Backups" anlegen, wenn das Ziel bereits 
existiert.

Eine Umbenennung könnte also so ähnlich geschehen:
1
for F in ./blabla/* ; do NFILE=$(echo $F | tr "[A-Z]" "[a-z]") ; mv --backup=numbered $F $NFILE  ; done

man mv ; man cp (s.a. "--suffix")
man rename ; man mmv
Gast
1
#!/bin/bash
2

3
#cd ./test
4

5
knownDirs=( _foo )
6

7
for d in *
8
do
9
  if [[ -d "$d" ]]; then
10
      lowerCase="${d@L}"   # in lowercase umwandeln
11
      echo "lowercase: $lowerCase"
12
      
13
      if [[ "${knownDirs[@]}" =~ "$lowerCase" ]]   
14
      then
15
        knownDirs+=("$lowerCase")
16
        # neue namen generieren
17
        # prefix solange genieren bis eines rauskommt das noch nicht exisitert
18
        new_name="$lowerCase"__$(($RANDOM % 10))
19
        while [[ -d "$new_name" ]]
20
        do
21
          new_name="$lowerCase"__$(($RANDOM % 10))
22
        done
23
        mv "$d" "$new_name"
24
        echo "$d  ->  $new_name"
25

26
      else
27
        knownDirs+=("$lowerCase")
28
      fi
29
  fi  # check auf dir
30
done
Gast
Sönke P. schrieb:
> Eine Umbenennung könnte also so ähnlich geschehen:for F in ./blabla/* ;
> do NFILE=$(echo $F | tr "[A-Z]" "[a-z]") ; mv --backup=numbered $F
> $NFILE  ; done
Das benennt alles um, auch Dateien wenn welche vorhanden sind.
Es sollen nur dirs umbenannt werden, das Gemurkse mit echo pipe nach tr 
braucht heute auch keiner mehr, @L existiert.
Gast
Herbert B. schrieb:
> Sönke P. schrieb:
>> Eine Umbenennung könnte also so ähnlich geschehen:for F in ./blabla/* ;
>> do NFILE=$(echo $F | tr "[A-Z]" "[a-z]") ; mv --backup=numbered $F
>> $NFILE  ; done
> Das benennt alles um, auch Dateien wenn welche vorhanden sind.
> Es sollen nur dirs umbenannt werden, das Gemurkse mit echo pipe nach tr
> braucht heute auch keiner mehr, @L existiert.

Das was Sönke da schrieb erscheint mir 1000 mal eleganter als dein 
Machwerk. Kleiner Tipp: Wenn man die Tools die man nutzt kennt, erkennt 
man auch relativ schnell wie Filter auf Verzeichnisse (-type d) setzt. 
Eine Begrenzung auf eine Verzeichnisebene ist ggf auch noch sinnvoll.
Herbert B. schrieb:
> Das benennt alles um, auch Dateien wenn welche vorhanden sind.

Dann ist ja gut, dass dein Script nicht nur exemplarisch, sondern 
universell ist (hust "_foo").

> Es sollen nur dirs umbenannt werden, das Gemurkse mit echo pipe nach tr
> braucht heute auch keiner mehr, @L existiert.

Dieser Bash-Trick mit ${VARIABLE@L}/${VARUABLE@U} ist ja fein. Aber wenn 
der TO nichtmal einfache Shellbefehle beherrscht, dann zeigt man ihm 
m.E. lieber erstmal "Gemurkse" mit Pipes und Standardutilities.
Hubert Kaiser schrieb:
> Ich möchte unter Linux in einem Verzeichnis gleichnamige Ordner, die
> sich nur durch Groß- bzw. Kleinschreibung unterscheiden, umbenennen
> lassen. Beispiel:
> [...]
> Das ganze dazu, damit unter Windows die Ordner korrekt angesprochen
> werden können. Kann hier jemand helfen?

Anbei ein schneller Hack in Python, der rekursiv über Unterverzeichnisse 
geht und auch Dateien umbenennen kann. Alle verwendeten Module sind in 
jeder Python-Standardinstallation vorhanden. YMMV, HTH.
Angehängte Dateien:
Gast
Sönke P. schrieb:
> Herbert B. schrieb:
>> Das benennt alles um, auch Dateien wenn welche vorhanden sind.
>
> Dann ist ja gut, dass dein Script nicht nur exemplarisch, sondern
> universell ist (hust "_foo").
_foo hat überhaupt keine Auswirkungen, kannst auch Sönke eintragen oder 
gar nix, das ändert überhaupt nichts an dem Script. Wenn du Ahnung 
hättest würdest du dich nicht an diesem Punkt aufhängen. Es enthält noch 
einen potentiellen Fehler, der ist dir Experte aber nicht mal 
aufgefallen.


> Dieser Bash-Trick mit ${VARIABLE@L}/${VARUABLE@U} ist ja fein.
Ist kein Trick, das ist ein Feature das man nutzt.


> Aber wenn der TO nichtmal einfache Shellbefehle beherrscht,
> dann zeigt man ihm
> m.E. lieber erstmal "Gemurkse" mit Pipes und Standardutilities.
Wasn das fürn lächerliches Ausredenargument? Dein Gepipe ist schlicht 
überflüssig, elegant ist wenn man ohne dieses auskommt, warum wirst du 
vermutlich nicht verstehen.
Gast
Hubert Kaiser schrieb:
> Hallo
>
> Ich möchte unter Linux in einem Verzeichnis gleichnamige Ordner, die
> sich nur durch Groß- bzw. Kleinschreibung unterscheiden, umbenennen
> lassen. Beispiel:
>
> ordner
> ORDNER
> Ordner
>
> Nach dem umbenennen:
>
> ordner
> ORDNER_001 (oder ähnlich)
> Ordner_002 (oder ähnlich)

Gemischte Groß- und Kleinschreibung ist immer noch schlampig!

Warum nicht einfach:

ordner_000
ordner_001
ordner_002

und grundsätzlich alles klein.
Gast
DPA schrieb:
> Kann man nicht Windows irgendwie beibringen, case-sensitive zu
> arbeiten?

Das ist auch ne Murkslösung, weil er dann jedes Windows umkonfigurieren 
muss, in dem er die Verzeichnisstruktur nur nutzen will.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.