Re: Der ls-Befehl und die verflixten Leerzeichen
Hallo,
Am Thu, 03 Sep 2015, Joachim Hartmann schrieb:
>-rw-r--r-- 1 root root 2015-08-30 23:20 20150212-090500_Birge Schade bei
>_Volle Kanne_-(Herzkino).jpg
>-rwxr-xrwx 1 root root 2015-06-27 00:34 20150212-090500_Birge Schade bei
>_Volle Kanne_-(Herzkino).mp4
>=======================================================================
>
>Mit dem Script generateThumbs.sh (www.Obihoernchen.net) werden Bilddateien
>erstellt.
>Mit dem Script removeThumbs.sh möchte ich die Bilddateien löschen, zu denen
>es keine Videodatei mehr gibt.
>Mein Ansatz dazu:
>- Schleife über alle JPG-Dateien
>- Je JPG-Datei die Anzahl der Dateien mit gleichem Namen - Dateiendung egal -
>ermitteln.
>- Ist die Anzahl 1, so exestiert nur die JPG-Datei. Diese wird dann gelöscht.
>Probleme bereiten mir die Leerzeichen im Dateinamen. Da $COUNT damit
>unbestimmt ist, ist die Variable mit 1 vorbesetzt.
>
>=======================================================================
>#!/bin/bash
>
>DIR="/var/cache/minidlna/mediathekview/"
>
>find "$DIR" -regex ".*\.jpg" -type f | while read -r FILEPATH
find "$DIR" -type f -name '*.jpg' | ...
reicht hier. Äh, und BTW: du suchst nach den Thumbnails ...
>do
> printf "%s\n" "--- Start Thumbnailremovement for ---"
> printf "%s\n" "$FILEPATH"
> THUMBFILE="'${FILEPATH%.*}'.*" # remove video ext. and add .jpg
schreibst hier aber über die Thumbnails ... Du meinst du wohl die
Videos ... Ergo:
MP4FILE="${FILEPATH/.jpg/.mp4}";
> COUNT=$(ls -l " $THUMBFILE "| wc -l)
^ ^ Hier hast du extra Leerzeichen,
und innerhalb der "" wird das .* innerhalb der
Variablen sowieso nicht expandiert.
Einfacher ist's einfach auf die Videodatei zu
testen.
> COUNT=1
> if [ $COUNT -eq 1 ]; then
> printf "\e[1;33m%s\e[0m\n" "Video does not exists, removing
>thumbnail!"
> #rm $FILEPATH
> else
> printf "\e[1;33m%s\e[0m\n" "Video does exists, do nothing!"
> fi
> printf "%s\n" "--- End Thumbnailcreation ---"
>done
>exit 0
Also, meine Variante nochmal als ganzes (die Debug-Ausgaben spare ich
mir hier) und bitte vor dem Scharfschalten gründlich mit entschärftem
"rm" (echo davor z.B.) und mit Debug-Ausgaben austesten!
==== UNGETESTET!!! ====
#!/bin/bash
DIR="/var/cache/minidlna/mediathekview/"
find "$DIR" -type f -name '*.jpg' | while read -r JPEGFILE; \
do
MP4FILE="${JPEGFILE/.jpg/.mp4}";
if ! test -f "$MP4FILE"; then
rm -v "$JPEGFILE";
fi
done
====
Das könnte man evtl. noch "optimieren" (ob's was bringt?):
==== AUCH UNGETESTET!!! ====
#!/bin/bash
DIR="/var/cache/minidlna/mediathekview/"
find "$DIR" -type f -name '*.jpg' -exec bash -c '\
for JPEGFILE; do
MP4FILE="${JPEGFILE/.jpg/.mp4}";
test -f "$MP4FILE" || rm -v "$JPEGFILE";
done' find-bash {} +
====
Das vermeidet nebenbei auch noch Probleme mit Leer- und anderen
Sonderzeichen, da die innere bash die Pfade/Dateinamen direkt von find
1:1 sauber per execve(3) im argv[] übergeben bekommt, ganz ohne pipe
und while und so, klappt also z.B. auch mit Dateinamen, die nen
Zeilenumbruch enthalten, allem was erlaubt ist eben[1], startet aber
für alle N Dateinamen (was noch an Dateinamen halt in $(getconf
ARG_MAX) Bytes passt) nochmal ne neue shell ... Was schneller ist? k.A.
HTH,
-dnh
[1] alles außer ASCII 0 aka '\0' also
--
All generalisations are dangerous, including this one.
Reply to: