• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Massen-Umbenennung & Rechte Vergabe mit mv -

Catull

Hacker
Hallo,

ich habe in verschiedenen Unterordnern die von einem Hauptordner abgehen etliche .JPG und .jpg Dateien liegen (Siehe auch diesen Thread), die zudem auf unterschiedliche Rechte gesetzt sind. Diese wollte ich rekursiv mit mv umbenennen.
Leider scheitert das an mangelnder Sachkenntnis :-(
Hier das Ergebnis meiner Muehen mit der mv-Syntax...
Code:
_test> ll
insgesamt 816
-r-xr-xr-x  1 catu users 180224 2006-04-25 12:32 ALSTO_X_03.JPG
-r-xr-xr-x  1 catu users 282936 2006-04-25 14:15 SKOD_645_03.jpg
-r-xr-xr-x  1 catu users 201888 2006-04-25 14:15 SKOD_645_04.jpg
-r-xr-xr-x  1 catu users 159745 2006-04-25 14:13 SKOD_645_06.jpg
drwxr-xr-x  2 catu users    144 2006-05-05 09:48 test2

 mv *.JPG *.jpg
mv: target „SKODA_645_06.jpg“ is not a directory
Fragen
====
Wie kriege ich es hin, dass alle Bilder in den Unter-Verzeichnissen (-r geht nicht/gibts nicht) auf .jpg geaendert werden.

Wie kann ich die Rechte durchgaengig auf lesbar setzen. Zum Teil wurden Bilder im Web nicht dargestellt, da die Rechte fehlten.
Schaetze dafuer braeuchte ich chmod?

Bedankt

Catull
 

schusch

Newbie
Hi,
versuch mal

Code:
for file in *.JPG; do
name=`basename $file .JPG`
mv $file "$name".jpg
done

!
Funktioniert nur, wenn die Dateinamen keine Leerzeichen enthalten
 
OP
C

Catull

Hacker
schusch schrieb:
Code:
for file in *.JPG; do
name=`basename $file .JPG`
mv $file "$name".jpg
done
Klappt prima. Danke!
Wie kriege ich dein Script dazu, die Unterverzeichnisse ebenfalls ´abzuarbeiten´?

schusch schrieb:
Funktioniert nur, wenn die Dateinamen keine Leerzeichen enthalten
Gut das du es sagst, einige der Bilder ahben in der Tat Leerzeichen im Dateinamen. Wie kann ich die ggf. automatisiert durch `_` ersetzen lassen?
Oder sollte ich fuer die Frage besser einen eigenen Thread aufmachen?
 
OP
C

Catull

Hacker
Hi, das kam waehrend meiner letzten Antwort.
panamajo schrieb:
Um lediglich alle .JPG nach .jpg umzubenennen geht auch
Code:
$ rename .JPG .jpg *.JPG
In der Tat. Danke.
Auch hier die Frage, wie kriege ich es hin, dass die abgehenden Unterverzeichnisse ebenfalls bearbeitet werden.
 

schusch

Newbie
Ooops! Wer lesen kann ...
Du hast Unterverzeichnisse, also dann

Code:
for file in $(find . -name '*.JPG');do
dir=$(dirname $file)
name=$(basename $file .JPG) 
mv $file "$dir"/"$name".jpg 
done
 

schusch

Newbie
Hi,

Leerzeichen durch '_' ersetzen

entweder
echo "Hallo Welt" | tr ' ' '_'
oder
echo "Hallo Welt" | sed 's/ /_/g'
 
OP
C

Catull

Hacker
Danke, das klappt jetzt mit den Unterverzeichnissen.

schusch schrieb:
Leerzeichen durch '_' ersetzen
entweder
echo "Hallo Welt" | tr ' ' '_'
oder
echo "Hallo Welt" | sed 's/ /_/g'
Du ueberforderst mich ;-)
Es klappt beides, wenn ich es in der shell eingebe. Aber, wie muss ich es aufrufen, wenn ich vom Oberverzeichnis an alle Unterverzeichnisse nach einer Leerstelle in einem Dateinamen suchen/ersetzen lassen will.
Vorher
Code:
Oberverzeichnis  |
                |__ Unterverzeichnis 1
                |__ Unterverzeichnis 2
                |__ Unterverzeichnis 3  datei mit leerzeile.jpg
                |__ Unterverzeichnis n
Nacher
Code:
Oberverzeichnis  |
                |__ Unterverzeichnis 1
                |__ Unterverzeichnis 2
                |__ Unterverzeichnis 3  datei_mit_leerzeile.jpg
                |__ Unterverzeichnis n
 

schusch

Newbie
Hi,

ich hoffe deine Verzeichnisnamen haben keine Leerzeichen :roll:

Wir haben das Problem, dass eine For-Schleife nicht funktioniert. wegen der Leerzeichen.
Alle Dateien in den Unterverzeichnisse bekommen wir mit:

Code:
find .  -type f -print

Was wir brauchen ist

Code:
mv "<Zeile der Ausgabe des find Kommandos>" <Zeile der Ausgabe des find-Kommandos ohne Leerzeichen

So was kann ganz prima der awk. Das sieht dann so aus

Code:
find .  -type f -print | awk '{
tmp=$0
gsub(" ","_",tmp)
printf ("mv \"%s\" %s\n", $0, tmp)
}'

des awk Skript gibt also die benötigten Kommandos aus.

Damit diese ausgeführt werden machen wir einfach:

Code:
find .  -type f -print | awk '{
tmp=$0
gsub(" ","_",tmp)
printf ("mv \"%s\" %s\n", $0, tmp)
}' | sh

Gruß
schusch

P.S. Bevor du
Code:
|sh
anhängst solltest du schauen, was der awk ausgibt. Wie schnell hat man ein quote oder doublequote vergessen :)

P.P.S. [EDIT] Wie schnell hat man eine [ zuviel (war bei gsub)
 

ginka

Member
rename ist wunderbar kurz & knackig! Und find geht übrigens automatisch rekursiv durch alle Unterverzeichnisse. Wenn du beide zusammen nimmst, kannst du dir eine Schleife und damit Tipparbeit sparen:

Code:
find . -name '*.JPG' -exec rename .JPG .jpg {} \;

Gruß
ginka
 

sc_m

Member
Falls es noch von Interesse ist: Durch Ändern von IFS kann man der Bash sagen, welche Zeichen als Listentrenner gelten sollen. Man sollte diese Variable nur in einer Subshell ändern, weil man sonst später Probleme bekommen könnte, aber dann machen auch Leerzeichen in Dateinamen keine Schwierigkeiten mehr:
Code:
bash> (IFS=`echo -e "\n"`; for i in $(find); do echo "$i"; done)
 
OP
C

Catull

Hacker
Uuups, sorry ich wollte hier nur noch `dicht machen`.

So, Dank noch mal an alle fuer die genialen Hinweise.
Insbesondere an Schusch fuer die AWK Skripte.
 
Oben