[Skript] Dateien massenhaft umbenennen

KaeTuuN

Rear Admiral
Registriert
Okt. 2002
Beiträge
5.304
Hallo zusammen,

ich habe hier gerade ein paar 1000 Dateien, die ich gerne alle nach einem bestimmten Format benennen möchte.

Ausgangssituation:
/Pfad/<Ordner A>/<Ordner AA>/<Datei mit falschem Namen>.<Endung>

Ziel:
Ordner bleiben gleich, aber die Dateien heißen jetzt wie folgt:
<Ordner A> - <Ordner AA>.<Endung>

Problem ist, dass in <Ordner AA> noch weitere Dateien sind, ich möchte aber nur Dateien mit einer bestimmten Endungen umbenennen.

Das ganze wäre also in etwa so:
Wenn <Dateiendung> == <Endung> dann <Dateiname> = <Ordner A> - <Ordner AA>.<Endung>
Ist eigentlich ganz einfach, ich weiß nur nicht, wie ich das unter Linux in ein Skript packe. :-/
Ich hoffe ihr könnt mir helfen.

Mfg Kae
 
sikarr schrieb:
Oh, Linux solltest du an die erste Stelle schrieben, das hab ich glatt überlesen:D
Bis zu der Stelle sind mir zig Ideen gekommen, und habe schon den Editor geöffnet um ein Script zu schreiben und dann peng. Wäre wirklich gut wenn im Titel oder zumindest ganz oben schon steht, dass es um Linux geht.

Edit: Ok, ist natürlich im Linux Forum. Naja, ist dann natürlich mein Fehler. Die Startseite gibt solche Informationen nur leider nicht her, weswegen ich auf Schema F reingefallen bin.
 
Hi,

Dann werfen wir mal KRename in den Raum.

Das fuer den TE zu scripten widerstrebt mir so spaet am "morgen" da ich 1. eigentlich nicht verstehe, was da wirklich passieren soll beim Umbenennen und 2. das es zu Dateinamenskonflikten kommen kann wenn es nach dem Schema des TE geht. :D

Egal. Feierabend. :D

BFF
 
Sorry... hatte nicht mit der Forumspalte auf der Hauptseite gerechnet.

Ich habe bisher folgendes:
Bash:
for file in *.epub;
do
    mv $file "$(cut -d'/' -f7 <<< $(readlink -f test.abc)) - $(cut -d'/' -f8 <<< $(readlink -f test.abc)).abc"
; done
Damit kann ich die Datei im entsprechenden Pfad korrekt umbenennen. Was mir jetzt fehlt ist der Rahmen, der alle Ordner durchsucht und diese Schleife ausführt...

@BFF Da es in jedem Ordner jeden Dateityp nur ein mal gibt, kann es nicht zu Dateikonflikten kommen.
Code:
/aaa/bbb/ccc/ddd/eee/
├── Folder, ffa
│   ├── Folder111
│   │   ├── test.jpg
│   │   ├── test123.xml
│   │   ├── test.log
│   │   └── test.opd
│   ├── Folder112
│   │   ├── test.jpg
│   │   ├── test123.xml
│   │   ├── test.log
│   │   └── test.opd
│   └── Folder113
│       ├── test.jpg
│       ├── test123.xml
│       ├── test.log
│       └── test.opd
├── Folder, ffb
│   ├── Folder111
│   │   ├── test.jpg
│   │   ├── test123.xml
│   │   ├── test.log
│   │   └── test.opd
│   ├── Folder112
│   │   ├── test.jpg
│   │   ├── test123.xml
│   │   ├── test.log
│   │   └── test.opd
│   └── Folder113
│       ├── test.jpg
│       ├── test123.xml
│       ├── test.log
│       └── test.opd
└── Folder, ffc
    ├── Folder111
    │   ├── test.jpg
    │   ├── test123.xml
    │   ├── test.log
    │   └── test.opd
    ├── Folder112
    │   ├── test.jpg
    │   ├── test123.xml
    │   ├── test.log
    │   └── test.opd
    └── Folder113
        ├── test.jpg
        ├── test123.xml
        ├── test.log
        └── test.opd
Von dieser Struktur möchte ich jetzt jeweils die "test.log" Dateien umbenennen. Immer nach dem gleichen Schema. Die oberste "test.log" Datei müsste "Folder, ffa - Folder111.log" heißen. Der Name ist also die Verkettung der beiden übergeordneten Ordner. Ich hoffe, dass ist jetzt verständlicher.

Mfg Kae
 
KaeTuuN schrieb:
Was mir jetzt fehlt ist der Rahmen, der alle Ordner durchsucht und diese Schleife ausführt...
Der Rahmen:

find . -name "*.log" | while IFS= read -r line
do
echo "$line"
done

Zwischen do und done (gehören zur while-Schleife) hast du jeweils einen Dateinamen samt Pfad in $line und kannst diesen verarbeiten. Im Beispiel wird jeweils die Zeile via echo unbearbeitet ausgegeben.
 
  • Gefällt mir
Reaktionen: KaeTuuN
Mit $ find . -name "test.log" -exec sollte das gehen.

{} gibt dir das aktuelle File, kannst du mit basename/dirname den File/Dir namen holen und mv ausfuehren. Mit -exec sh -c kannst du die ganze Suppe an eine Subshell werfen. Hab gerade kein Bash am Start um das zu testen (<<< ist Bash spezifisch).
 
  • Gefällt mir
Reaktionen: KaeTuuN
@mensch183 & @Elcrian
Ich danke euch beiden! :) Wenn meine Tests stimmen, passt das ganze wie folgt:
Bash:
find . -name "*.log" | while IFS= read -r line; do
mv "$line" "$(dirname "$line")/$(cut -d'/' -f2 <<< $(dirname "$line")) - $(cut -d'/' -f3 <<< $(dirname "$line")).log";
done

Mfg Kae
 
Zurück
Oben