Forum: PC-Programmierung Linux Ordner automatisch umbenennen


von Hubert Kaiser (Gast)


Lesenswert?

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?

von DPA (Gast)


Lesenswert?

Kann man nicht Windows irgendwie beibringen, case-sensitive zu arbeiten? 
z.B. so: 
https://www.howtogeek.com/354220/how-to-enable-case-sensitive-folders-on-windows-10/

von Alexander (alecxs)


Lesenswert?

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.

: Bearbeitet durch User
von Markus W. (dl8mby)


Lesenswert?

Wie wäre es, wenn Du von hausaus jedem Ordner eine fortlaufende Nummer
in Form eines Suffix anhängst _001, _002 etc.
Der Filemanager unter Win hätte dann die Unterscheidung, die er 
benötigt.

Markus

von Sönke P. (s03nk3)


Lesenswert?

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

von Herbert B. (Gast)


Lesenswert?

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

von Herbert B. (Gast)


Lesenswert?

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.

von Alexander (alecxs)


Lesenswert?

Wenn dann bitte richtig (Leerzeichen!) und auch gleich Zeichensatz 
konvertieren den Windows auch erlaubt.
1
's/[^][A-Za-z0-9 !#$%&'$'\047''()+,.\/;=@'$'\136''_\`{}~'$'\177''-]/_/g'
https://dwheeler.com/essays/filenames-in-shell.html#wrong

von JJ (Gast)


Lesenswert?

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.

von Sönke P. (s03nk3)


Lesenswert?

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.

von Ein T. (ein_typ)


Angehängte Dateien:

Lesenswert?

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.

von udok (Gast)


Lesenswert?

Euch muss ja unendlich langweilig sein, dass ihr immer noch auf den 
Troll reagiert...

von Alexander (alecxs)


Lesenswert?

wer's sagt isses selber

von Herbert B. (Gast)


Lesenswert?

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.

von Ein T. (ein_typ)


Lesenswert?

Herbert B. schrieb:
> das ist ein Feature das man nutzt.
>
> Dein Gepipe ist schlicht
> überflüssig, elegant ist wenn man ohne dieses auskommt,

Pipes sind ein Standardfeature vieler Shells, warum sollte man die nicht 
benutzen? @L hingegen ist ein Bashism... hm.

von Alexander (alecxs)


Lesenswert?

Es gibt 99 verschiedene Möglichkeiten das zu lösen, kommt mal runter.

von Nano (Gast)


Lesenswert?

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.

von Nano (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.