ubuntuusers.de

Zusammensetzung von Dateinamen

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 16.10 (Yakkety Yak)
Antworten |

lyzzy

Anmeldungsdatum:
14. Februar 2017

Beiträge: Zähle...

Hallo,

ich bin gerade dabei ein Script bzw. vielleicht auch Einzeiler für mein Problem zu schreiben - aber irgend woran scheitert es ☹

Zu meinem Problem - ich habe einen Ordner mit mehreren unter Ordnern - diese wiederum enthalten Dateien. Mein Ziel ist es, den übergeordneten Order und den Namen der Dateien zusammen zu setzen. Das ganze sieht ungefähr wie folgt aus.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

Ordner_Haupt
   |
   Ordner2015
   |    | 
   |     DateiA
   |
   Ordner2016
        | 
        DateiB

Ich möchte das die DateiA u. DateiB zu Ordner2015+DateiA bzw. Ordner2016+DateiB umbenannt werden. Nun habe ich in der Shell schon ein wenig herum probiert - aber so recht will es nicht laufen...

1
for i in $(find * -mtime -13 -name "*A*" -execdir curdir="${PWD##*/}" mv $i "$curdir+$i" \; ); do echo $i; done

das -mtime ist noch eine Erweiterung die erst mal unbedeutend ist...

Als Fehlermeldung bekomme ich folgendes zurück geliefert

1
find: "curdir=Ordner2015": Datei oder Verzeichnis nicht gefunden

An dieser Stelle komme ich nun nicht weiter... es gelinkt mir leider nicht den übergeordneten Order zwischen zu speichern ☹

Vielleicht hat ja irgendjemand einen Tipp für mich, um dieses Problem zu beheben -

Viel Dank schon einmal im voraus

LG

PhotonX

Avatar von PhotonX

Anmeldungsdatum:
3. Juni 2007

Beiträge: 4471

Wohnort: München

Ich würde das Setzen von curdir aus dem find Aufruf auslagern, sonst klappt es wohl nicht. Also:

1
2
curdir="${PWD##*/}"
for i in $(find * -mtime -13 -name "*A*" -execdir $curdir mv $i "$curdir+$i" \; ); do echo $i; done

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Lyzzy,

zuerst mal herzlich willkommen hier auf dem Forum !

lyzzy schrieb:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

Ordner_Haupt
   |
   Ordner2015
   |    | 
   |     DateiA
   |
   Ordner2016
        | 
        DateiB

Verstehe ich das richtig, dass der Verzeichnisbaum nach der Aktion so aussehen soll ? :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

Ordner_Haupt
   |
   Ordner2015
   |    | 
   |    Ordner2015_DateiA
   |
   Ordner2016
        | 
        Ordner2016_DateiB

Die Ausgabe von find zu parsen und dann weiter zu verarbeiten ist auf jeden Fall Mist.
Nimm entweder eine for- Schleife, oder find ... -exec , dann ist alles gut.

Zum Umbenennen selbst wirst Du sinnvollerweise das Perl- rename nehmen, das kann alles was Du willst mit seinen Bordmitteln.
Konkret: mit Hilfe von passenden Regulären Ausdrücken.

Also entweder sowas (wenn alle Dateien auf der 2. Verzeichnisebene stehen):

1
2
3
for f in Ordner_Haupt/*/* ;  do
        rename -nv  's|(.*)/([^/]*)/([^/])|$1/$2/$2_$3|'  "$f"
done

oder, wenn es wirklich komplizierter wird, mit find ... -exec :

1
find Ordner_Haupt/*/ -exec rename -nv  's|(.*)/([^/]*)/([^/])|$1/$2/$2_$3|' {} \;

Mit der Option -n fährt rename erstmal nur einen Probelauf und zeigt, was es tun würde. Sobald Du die Option wegnimmst, wird es ernst.

LG,

track

lyzzy

(Themenstarter)

Anmeldungsdatum:
14. Februar 2017

Beiträge: 3

Guten Morgen,

vielen Dank für eure Antworten!

@track - ja genau - so wollte ich das Ergebnis haben!

rename hatte ich auch schon auf dem Schrim - wobei mich die regulären Ausdrücke einwenig abgeschreckt haben ☺

Ich werde beides mal testen ,und schauen ob es irgendwie klappt!

LG

lyzzy

(Themenstarter)

Anmeldungsdatum:
14. Februar 2017

Beiträge: 3

Hallo,

Danke nochmals für eure Hilfe,

mit der Lösung von track und rename , hat es super geklappt! ☺

Antworten |