[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bash-Skript in Ordnern und Unterordnern abarbeiten



Klaus Becker:
> n'Abend,
> 
> ich habe auf meiner FP jede Menge Fernsehsendungen und möchte die Namen 
> vereinfachen, etwa so:
> 
> 20141230_2015-VOX-Tierischer_Jahresrueckblick.ts 
> => tierischer_jahresrueckblick.mpg

Ich mache sowas gerne mit qmv aus dem Paket renameutils. Damit kann man
interaktiv in einem Texteditor arbeiten. Setzt voraus, dass man einen
"ordentlichen" Editor bedienen kann, der bei sowas hilft.

> Dazu habe ich mir ein Skript geschrieben, das funktionniert, aber nicht in 
> Unterordnern.

Was heißt, es funktioniert nicht in Unterordnern? Meinst Du, es arbeitet
nur mit den Dateien im aktuellen Verzeichnis und nicht rekursiv durch
alle Unterverzeichnisse?

> Ich habe Serien aufgenommen wie z. B. Yakari, und ohne das Datum und den 
> Fernsehsender haben die Dateien alle den gleichen Namen. Daher numeriere ich 
> alle Dateien (und gebe ihnen die Endung "mpg") zunächst mit
> 
> declare -i i=1
> for file in $(find -name "*"); do
> mv $file $(echo $file | sed s/$/$i.mpg/g)
> (( i = i + 1 ))

Ich kann Dein Problem nicht nachvollziehen. Beispiel:

$ find . -type f
./a/a
./a/c
./a/b
./c/a
./c/c
./c/b
./b/a
./b/b

$ declare -i i=1
$ for file in $(find -name "*"); do
> echo $file | sed s/$/$i.mpg/g
> (( i = i + 1 ))
> done
.1.mpg
./a2.mpg
./a/a3.mpg
./a/c4.mpg
./a/b5.mpg
./c6.mpg
./c/a7.mpg
./c/c8.mpg
./c/b9.mpg
./b10.mpg
./b/a11.mpg
./b/b12.mpg

Was aber falsch läuft: Dein find findet nicht nur reguläre Dateien,
sondern auch Verzeichnisse. Du solltest immer ein Verzeichnis mitgeben
und in diesem Fall auf reguläre Dateien filtern:

find ./ -type f

Das '-name "*"' ist unsinnig und kann weg. Dann hast Du so ein Problem
mit Leerzeichen in Datei-/Verzeichnisnamen, das wurde ja schon genannt.
Etwas robuster:

find . -type f | while read file; do
  echo $file | sed s/$/$i.mpg/g
  (( i = i + 1 ))
done

Benenne ich mein Verzeichnis "c" in "cc cc" (mit Leerzeichen) um kriege
ich so:

$ find . -type f | while read file; do echo $file | sed s/$/$i.mpg/g ;
(( i = i + 1 )); done
./cc cc/a1.mpg
./cc cc/c2.mpg
./cc cc/b3.mpg
./a/a4.mpg
./a/c5.mpg
./a/b6.mpg
./b/a7.mpg
./b/b8.mpg

Und wenn Du anstelle dem echo | sed printf verwendest, kannst Du auch
führende Nullen haben:

printf "%s-%03i.mpg\n" "$file" "$i"

J.
-- 
If I had to live on a desert island I would take a mobile phone,
preferably a Nokia 8810.
[Agree]   [Disagree]
                 <http://archive.slowlydownward.com/NODATA/data_enter2.html>

Attachment: signature.asc
Description: Digital signature


Reply to: