shell -> Datei mit bestimmtem Namen kopieren



  • Hallo,

    ich möchte mit shellprogrammierung eine Datei kopieren, die das aktuelle Datum im Dateinamen enthält.

    Dateiname:
    z.B. x.y.....26.04.2016.tar.gz
    ..mmmm..er...26.04.2016.tar.gz

    Wie programmiere ich dies, daß nur diese Datei(en) kopiert wird/werden, sollte natürlich automatisch laufen

    z.B.

    aktdatum=$(date +"%y-%m-%d")
    

    Es muss der Dateiname(n) als Ergebnis kommen, nicht etwa mit

    find ..-name *.tar.gz
    

    ... usw"

    Das Shellprogramm sollte als Ergebnis eine Variable, oder Array haben, das alle Dateien mit heutigem Datum im Namen zurückliefert.

    Danke


  • Mod

    Das sollte eigentlich ganz direkt funktionieren, ohne dass man irgendwelche Verrenkungen machen muss. Zum Beispiel:

    find . -name \*"$VARIABLE_MIT_DATUMSTRING"\*
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum Linux/Unix in das Forum Themen rund um die IT verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • find solltest du in Shell-Skripten grundsätzlich mit -print0 verwenden, sonst geht dein Skript kaputt bei Dateinamen mit Leerzeichen oder ähnlichem.

    Ich geh mal davon aus, dass du Bash verwendest?
    Es klingt eher so, als bräuchtest du einfach nur ein Bash-Array und kein find.

    dateien=( *$(date --iso-8601)* )
    

    Das expandiert zu den Namen aller Dateien im aktuellen Ordner, die das aktuelle Datum im Namen haben. Es sollte mindestens eine solche Datei geben, sonst passieren je nach Bash-Flags unerwartete Dinge (entweder ein Fehler oder ein 1-elementiges Array ohne Expandierung).

    Danach kannst du die Dateien verarbeiten, indem du die Variable in der Form "${dateien[@]}" verwendest. Vor allem die "" um die Variable sind hier wichtig. Beispiel:

    mv "${dateien[@]}" /tmp/
    

    verschiebt alle Dateien nach /tmp/.



  • Hallo Christoph,

    ich benutze wie oben genannt die shell 🙄 .
    Das sollte aber, so denke ich, nicht das Problem sein.

    Wie geschrieben möchte ich die Suche nach den passenden Dateinamen in einem Script benutzen. Dieses Script läuft aber nicht im gleichen Verzeichnis wie die zu suchenden Dateien.
    Wie müsste dein Code aussehen wenn ich z.B. im Verzeichnis "/var/log/xyz" die Dateien suchen muß ?

    Was bedeutet

    find solltest du in Shell-Skripten grundsätzlich mit -print0 verwenden, sonst geht dein Skript kaputt bei Dateinamen mit Leerzeichen oder ähnlichem.

    Danke



  • worst_case schrieb:

    ich benutze wie oben genannt die shell 🙄 .

    Welche Shell? Es gibt mehr als eine.

    worst_case schrieb:

    Wie geschrieben möchte ich die Suche nach den passenden Dateinamen in einem Script benutzen. Dieses Script läuft aber nicht im gleichen Verzeichnis wie die zu suchenden Dateien.
    Wie müsste dein Code aussehen wenn ich z.B. im Verzeichnis "/var/log/xyz" die Dateien suchen muß ?

    dateien=( /var/log/xyz/*$(date --iso-8601)* )
    

    Aber wie gesagt: Du musst checken, ob es mindestens eine solche Datei gibt.

    Zum Beispiel mit

    dateien=( /var/log/xyz/*$(date --iso-8601)* )
    if [[ -e ${dateien[0]} ]]; then
        # alles gut
    else
        # Keine passende Datei existiert
    fi
    

    worst_case schrieb:

    Was bedeutet

    find solltest du in Shell-Skripten grundsätzlich mit -print0 verwenden, sonst geht dein Skript kaputt bei Dateinamen mit Leerzeichen oder ähnlichem.

    Das bedeutet, dass find ohne -print0 in Shellskripten nahezu immer falsch ist.

    find ohne -print0 gibt einen Dateinamen pro Zeile aus. Aber niemand verbietet Dateinamen, die newlines enthalten, d.h. ein einzelner Dateiname kann aus mehr als einer Zeile bestehen.

    Die Ausgabe von find ohne -print0 zerstört also unwiderruflich Information über die echten Dateinamen.

    Wenn man nicht überaus vorsichtig weiterprogrammiert, passiert es in bash außerdem sehr schnell, dass Leerzeichen in Dateinamen genauso wie newlines betrachtet werden. D.h. das Skript betrachtet eine Datei mit dem Namen "A B" stattdessen als zwei Dateien "A" und "B".



  • ls | grep "DATUM" | ....
    

  • Mod

    Superschlau schrieb:

    ls | grep "DATUM" | ....
    

    Keine gute Idee, aus den bereits von Christoph angesprochenen Gründen. Bloß, dass es hier im Gegensatz zu find und dem normalen Globbing keine Möglichkeit gibt, das Ergebnis zu korrigieren. Als Faustregel kann man sich merken, dass die Weiterbenutzung von ls-Ausgaben in Shellscripts immer falsch ist.


Anmelden zum Antworten