Dateien Umbenennen und verschieben

Smashi

Benutzer
Mitglied seit
13. Sep 2022
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo,

ich habe hier im Forum den nachfolgenden Code gefunden, der mir sehr weitergeholfen hat, um unsere gescannten und digitalen Belege umzubenennen und zu verschieben.

for f in /volume1/GemeinsamerOrdner/scan*.pdf
do
mv -n "$f" "/volume1/GemeinsamerOrdner/$(date -r "$f" +"%Y%m%d_%H%M%S").pdf"
done

Nun kommt es leider vor, dass es Dateien gibt, die exakt das Gleiche Datum und Uhrzeit haben, wenn Sie aus einem externen Programm heruntergeladen wurden. Dann wird das durch die Option -n aber nicht weiterverarbeitet.

Wie bekomme ich es hin, dass der Befehl in diesen Fällen “(1)“ usw. hinter den Dateinamen schreibt?

Habe schon versucht einen If Befehl einzubauen um zu prüfen, ob die Datei existiert, damit bin ich aber mit meinen geringen Kenntnissen gescheitert 🙈.

Ich wäre für einen Tipp dankbar.

Gruß

Smashi
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Also, wenn ich dein Vorhaben korrekt verstanden habe dann möchtest du folgendes.

Ausgangsposition
Viele Dateien können bis auf die Sekunde genau den gleichen Zeitstempel des Erstelldatums haben.
Hier im Beispiel sind es 4 Dateien mit dem gleichen Datum.
Code:
d---------+ 1 root root  80 Jun 23 22:52 .
d---------+ 1 root root 498 Jun 23 22:32 ..
----------+ 1 root root   0 Jun 23 22:52 scan_a.pdf
----------+ 1 root root   0 Jun 23 22:52 scan_b.pdf
----------+ 1 root root   0 Jun 23 22:52 scan_c.pdf
----------+ 1 root root   0 Jun 23 22:52 scan_d.pdf

Gewünscht ist es, diese umbenennen in Datum und fortlaufende Nummer falls bereits existiert.
Code:
d---------+ 1 root root 176 Jun 23 22:52  .
d---------+ 1 root root 498 Jun 23 22:32  ..
----------+ 1 root root   0 Jun 23 22:52 '20230623_225233 (1).pdf'
----------+ 1 root root   0 Jun 23 22:52 '20230623_225233 (2).pdf'
----------+ 1 root root   0 Jun 23 22:52 '20230623_225233 (3).pdf'
----------+ 1 root root   0 Jun 23 22:52  20230623_225233.pdf


Dann wird dir genau dieses Script dabei helfen:
Bash:
#!/bin/bash

OIFS=$IFS;
IFS=$'\n'

path=/volume1/GemeinsamerOrdner

for f in `find "$path" -type f -name "scan*.pdf"`; do
    if [ -f "$path/$(date -r "$f" +"%Y%m%d_%H%M%S").pdf" ]; then
        idx=1
        while (true); do
            if [ -f "$path/$(date -r "$f" +"%Y%m%d_%H%M%S") ($idx).pdf" ]; then
                idx=$((idx+1))
            else
                mv -n "$f" "$path/$(date -r "$f" +"%Y%m%d_%H%M%S") ($idx).pdf"
                break
            fi
        done
    else
        mv -n "$f" "$path/$(date -r "$f" +"%Y%m%d_%H%M%S").pdf"
    fi
done

IFS=$OIFS

exit 0
 

Smashi

Benutzer
Mitglied seit
13. Sep 2022
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Guten Morgen,

vielen Dank! Das funktioniert perfekt.

Danke und Gruß

Smashi
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Das freut mich. Vielen Dank für deine Rückmeldung.
 

Smashi

Benutzer
Mitglied seit
13. Sep 2022
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo,

eigentlich war das Thema erledigt, aber mich hat der Ehrgeiz gepackt ;)

Ich habe das o. a. Script etwas erweitert:

Bash:
#!/bin/bash

OIFS=$IFS;
IFS=$'\n'

logFile="/volume1/Temp/Belege/Log/$(date +"%Y%m%d") Script Belege.log"
logDate=$(date "+%d.%m.%Y %H:%M:%S")

touch $logFile

echo "$logDate Script wurde gestartet" >> $logFile

declare -a belegArt

belegArt[0]="belegArt1"
belegArt[1]="belegArt2"
belegArt[2]="belegArt3"
belegArt[3]="belegArt4"
belegArt[4]="belegArt5"

echo "$logDate Das Array belegArt wurde erstellt und enthaelt ${#belegArt[@]} Werte" >> $logFile

declare -a belegBereich

belegBereich[0]="belegBereich1"
belegBereich[1]="belegBereich2"
belegBereich[2]="belegBereich3"
belegBereich[3]="belegBereich4"

echo "$logDate Das Array belegBereich wurde erstellt und enthaelt ${#belegBereich[@]} Werte" >> $logFile

declare -a pathImport

for a in ${belegArt[@]}; do
    for b in ${belegBereich[@]}; do
        mkdir -p "/volume1/Belege/$a/$b"
        mkdir -p "/volume1/Temp/Belege/$a/$b"
        
        pathImport+=("/volume1/Belege/$a/$b")
    done
done

echo "$logDate Das Array pathImport wurde erstellt und enthaelt ${#pathImport[@]} Werte" >> $logFile

echo "$logDate Die Importordner werden durchsucht" >> $logFile

for p in ${pathImport[@]}; do

    echo "$logDate Der Ordner $p wird durchsucht" >> $logFile
    
    case "$p" in
        *"belegArt1"*)
            a=${belegArt[0]} ;;
        *"belegArt2"*)
            a=${belegArt[1]} ;;
        *"belegArt3"*)
            a=${belegArt[2]} ;;
        *"belegArt4"*)
            a=${belegArt[3]} ;;
        *"belegArt5"*)
            a=${belegArt[4]} ;;
    esac

    case "$p" in
        *"G1"*)
            b=${belegBereich[0]} ;;
        *"G2"*)
            b=${belegBereich[1]} ;;
        *"H1"*)
            b=${belegBereich[2]} ;;
        *"P1"*)
            b=${belegBereich[3]} ;;
    esac

    for f in `find "$p" -type f -name "*.pdf"`; do

        if [ -z "$f" ]; then
            echo "$logDate Keine Datei gefunden" >> $logFile
            continue
        else
            echo "$logDate Die Datei $(basename $f) wird verarbeitet" >> $logFile
        fi

        pathExport="/volume1/Temp/Belege/$a/$b"
        
        if [ -f "$pathExport/$(date -r "$f" +"%Y%m%d-%H%M%S-")$b-$a.pdf" ]; then
            idx=1
            while (true); do
                if [ -f "$pathExport/$(date -r "$f" +"%Y%m%d-%H%M%S-")$b-$a ($idx).pdf" ]; then
                    idx=$((idx+1))
                else
                    mv -n "$f" "$pathExport/$(date -r "$f" +"%Y%m%d-%H%M%S-")$b-$a ($idx).pdf"
                    break
                fi
            done
        else
            mv -n "$f" "$pathExport/$(date -r "$f" +"%Y%m%d-%H%M%S-")$b-$a.pdf"
        fi

    done

done

echo "$logDate Script wurde beendet" >> $logFile

IFS=$OIFS

exit 0

Jetzt bin gerade dabei eine Log Datei erzeugen zu lassen, um etwas nachzuvollziehen was ich da mache. Was ich nur nicht verstehe ist, warum wird nachfolgender Log Eintrag nicht geschrieben?

Bash:
if [ -z "$f" ]; then

           echo "$logDate Keine Datei gefunden" >> $logFile

            continue

        else

            echo "$logDate Die Datei $(basename $f) wird verarbeitet" >> $logFile

        fi

Wird die erste Schleife automatisch übersprungen wenn keine Dateien vorhanden sind? Kann mir da jemand noch einmal einen Hinweis geben?

Danke und Gruß

Smashi
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
if [ -z "$f" ]; then
Hier willst du doch sicher prüfen ob die Datei existiert oder nicht?

Das -z bedeutet aber, dass hier geprüft wird ob der Inhalt der Variable leer ist. Aber hier befindet sich in der Variable $f der Dateipfad und ist somit nicht leer und deshalb erreichst du diesen Teil des Codes nicht.

Das was du prüfen möchtest ist, ob die Datei existiert und das macht man dann mit einem -f. Und wenn du prüfen möchtest ob die Datei NICHT existiert, dann musst du noch eine Negation einfügen mit einem ! Ausrufezeichen.

Somit sollte die Bedingung wie folgt aussehen: if [ ! -f "$f" ]; then
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Nun ja ... mir ist da aber noch etwas aufgefallen. Die Bedingung der if-Anweisung wird in diesem Konstrukt nie aufgerufen.

1687802415287.png

Die Bedingung für die Schleife (grün markiert) ist, dass der Befehl find etwas gültiges zurückliefert und somit die Variable $f weder leer sein kann noch, dass die gefundene Datei nicht existiert. Denn find, liefert nur die Dateien zurück die auch gefunden werden.
Wird der find Befehl keine Datei finden, so wird auch die Schleife nicht durchlaufen.
Und dabei ist es hier völlig egal, ob man für die If-Anweisung als Bedingung -z "$f" oder ! -f "$f" verwendet.
 
  • Like
Reaktionen: geimist

Smashi

Benutzer
Mitglied seit
13. Sep 2022
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo @luddi,

danke für deine weitere Antwort.

Das war auch etwas zu viel des Guten mit dem Log Eintrag. Ich lasse mir jetzt nur protokollieren, wenn eine Datei verarbeitet worden ist.

Danke und Gruß
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat