staging.inyokaproject.org

Dateiumbenennung mit Suchkriterien und Eingabetext

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

kopeter

Avatar von kopeter

Anmeldungsdatum:
9. Juli 2013

Beiträge: Zähle...

Hallo, ich hab ein ähnliches Problem. nur will ich nicht alle Dateien umbenennen, sondern nur bestimmte. Also z.B. welche die mit "Cover_-_" anfangen und mit ".pdf" aufhören. Im Gleichen Ordner wären dann noch Cover die mit ebenfalls mit "Cover_-_" anfangen aber mit ".png" aufhören und Vorschaubilder welche mit "Vorschau_-_" Anfangen und auch mit ".png" aufhören.

meine Anpassungen haben den Code aber leider nur verschlimmbessert und kaputt gemacht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
# chmod +x DateienBenennen.sh
# ./DateienBenennen.sh

endung=.pdf
beginnung=Cover_-_
echo $beginnung*$endung
for datei in $beginnung*$endung ; do 
        read zeile
        neuedatei="${datei%/*}/$beginnung$zeile$endung"
        mv $datei $neuedatei
done  <  TitelReihenfolge.txt

endung=.png
beginnung=Cover_-_
echo $beginnung*$endung
for datei in $beginnung*$endung ; do 
        read zeile
        neuedatei="${datei%/*}/$beginnung$zeile$endung" 
        mv $datei $beginnung$zeile$endung
done  <  TitelReihenfolge.txt

endung=.pdf
beginnung=Vorschau_-_
echo $beginnung*$endung
for datei in $beginnung*$endung ; do 
        read zeile
        neuedatei="${datei%/*}/$beginnung$zeile$endung" 
        mv $datei $beginnung$zeile$endung
done  <  TitelReihenfolge.txt

Der Fehler beginnt aber schon in der For-Schleife... So kann man das offensichtlich nicht machen 😳

mv: Aufruf von stat für '*.pdf' nicht möglich: Datei oder Verzeichnis nicht gefunden

Kann hier jemand weiterhelfen?

Moderiert von ChickenLipsRfun2eat:

Der Beitrag ist von „Dateien nach Textdateivorlage umbenennen“ abgetrennt worden. Bitte entführe keine Themen (Verhaltenscodex)!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

kopeter schrieb:

Ich habe das Skript noch nicht im Detail angeschaut, aber es ist schon klar, dass Du mehr quoten solltest. Es gibt da auch reichlich Redundanz in dem Skript. Wenn nicht alle for-Schleifen wieder neu aus TitelReihenfolge.txt lesen würden, könnte man das in einer Schleife zusammen fassen. Aber auch die aktuelle Version kann man mittels einer Shellfunktion verbessern:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash

shopt -s nullglob

rename() {
  for datei in "$1"*"$2"; do 
    read zeile || zeile=$(date +%s)-$RANDOM
    neuedatei="${datei%/*}/$1$zeile$2"
    mv "$datei" "$neuedatei"
  done < TitelReihenfolge.txt
}

rename Cover_-_ .pdf
rename Cover_-_ .png
rename Vorschau_-_ .pdf
mv: Aufruf von stat für '*.pdf' nicht möglich: Datei oder Verzeichnis nicht gefunden

Das bedeutet lediglich, dass es in dem Ordner keine Datei mit der Endung gibt:

1
2
3
4
5
$ ls
$ for datei in *.pdf; do mv "$datei" /tmp/x; done
mv: cannot stat '*.pdf': No such file or directory
$ for datei in *.pdf; do if [ -f "$datei" ]; then mv "$datei" /tmp/x; fi; done
$ 

Du brauchst so einen Test wie in Zeile 4. Oder Du ignorierst die Fehlermeldung. Oder Du nutzt nullglob, da Du ja schon mal die bash nutzt:

1
2
3
4
5
6
7
$ shopt nullglob 
nullglob       	off
$ shopt -s nullglob 
$ shopt nullglob 
nullglob       	on
$ for datei in *.pdf; do mv "$datei" /tmp/x; done
$ 

Ich finde an dem ganzen Ansatz allerdings beunruhigend, dass Du eine statische Eingabe (TitelReihenfolge.txt) mit einer dynamischen (die Globs) kombinierst. Wenn in der Datei mindestens 2 weniger Einträge sind als das Globben Dateien findet, geht die Sache schief, weil die letzten beiden Dateien den selben Namen bekommen. Mindestens müsstest Du einen Ersatzwert generieren, wenn der read schief geht, wie ich das oben gemacht habe.

kopeter

(Themenstarter)
Avatar von kopeter

Anmeldungsdatum:
9. Juli 2013

Beiträge: 124

Vielen herzlichen Dank. Ich verwende das Programm und es leistet gute Dienste

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/bin/bash

shopt -s nullglob

## rename bekommt den Dateipräfix als $1 und den Suffix bzwe. Endung als $2
rename() {
  for datei in "$1"*"$2"; do 
    read zeile || zeile=$(date +%s)-$RANDOM
    neuedatei="$1$zeile$2" #Die neue Datei hat den selben Anfang und die Selbe Endung wie die alte Datei, bekommt aber einen Neuen namen im Mittelteil
    mv "$datei" "$neuedatei"
  done < ../TitelReihenfolge.txt
}

rename Umschlag_-_ .pdf
rename ErsteInnenseite_-_ .pdf
rename Cover_-_ .png
rename CoverVorschau_-_ .png
rename UmschlagIcon_-_ .png
Antworten |