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

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: