[Skript] Dateien massenhaft umbenennen

KaeTuuN

Rear Admiral
Dabei seit
Okt. 2002
Beiträge
5.177
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

Lt. Commander
Dabei seit
Mai 2010
Beiträge
1.675
Advanced renamer.

Oh, Linux solltest du an die erste Stelle schrieben, das hab ich glatt überlesen:D
 

grill

Lt. Commander
Dabei seit
Dez. 2017
Beiträge
1.053
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.
 

BFF

Admiral
Dabei seit
Okt. 2017
Beiträge
9.791
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
 

KaeTuuN

Rear Admiral
Ersteller dieses Themas
Dabei seit
Okt. 2002
Beiträge
5.177
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
 

mensch183

Captain
Dabei seit
Jan. 2008
Beiträge
3.666
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.
 

Elcrian

Commander
Dabei seit
Feb. 2008
Beiträge
2.449
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).
 

KaeTuuN

Rear Admiral
Ersteller dieses Themas
Dabei seit
Okt. 2002
Beiträge
5.177
@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
 
Top