Holen Sie sich eine Liste der nach Datum gruppierten Dateien

Holen Sie sich eine Liste der nach Datum gruppierten Dateien

Ich habe ein Verzeichnis mit Dateien, die jeden Tag eingehen. Jetzt möchte ich diese Dateien nach Datum gruppieren und komprimieren. Gibt es eine Möglichkeit, die Dateien, die am selben Tag eingegangen sind, zu gruppieren/aufzulisten?

Angenommen, es gibt die folgenden Dateien in einem Verzeichnis

-rw-r--r--. 1 anirban anirban    1598 Oct 14 07:19 hello.txt
-rw-r--r--. 1 anirban anirban    1248 Oct 14 07:21 world.txt
-rw-rw-r--. 1 anirban anirban  659758 Oct 14 11:55 a
-rw-rw-r--. 1 anirban anirban    9121 Oct 18 07:37 b.csv
-rw-r--r--. 1 anirban anirban     196 Oct 20 08:46 go.xls
-rw-r--r--. 1 anirban anirban    1698 Oct 20 08:52 purge.sh
-rw-r--r--. 1 anirban anirban   47838 Oct 21 08:05 code.java
-rw-rw-r--. 1 anirban anirban 9446406 Oct 24 05:51 cron
-rw-rw-r--. 1 anirban anirban  532570 Oct 24 05:57 my.txt
drwxrwsr-x. 2 anirban anirban      67 Oct 25 05:05 look_around.py
-rw-rw-r--. 1 anirban anirban   44525 Oct 26 17:23 failed.log

Es gibt also keine Möglichkeit, die Dateien mit einem Suffix/Präfix zu gruppieren, da alle eindeutig sind. Wenn ich jetzt den gesuchten Befehl ausführe, erhalte ich eine Reihe von Zeilen wie unten, basierend auf der Gruppierung nach Datum.

[ [hello.txt world.txt a] [b.csv] [go.xls purge.sh] [code.java] ... ] and so on.

Mit dieser Liste werde ich eine Schleife durchlaufen und ein Archiv erstellen

tar -zvcf Oct_14.tar.gz hello.txt world.txt a

Antwort1

Mit zshwird ein assoziatives Array verwendet, dessen Schlüssel die Daten und dessen Werte die NUL-getrennte Liste der an diesem Datum zuletzt geänderten Dateien sind:

zmodload -F zsh/stat b:zstat
typeset -A files
for file (./*) {
  zstat -LA date -F %b_%d +mtime $file &&
    files[$date]+=$file$'\0'
}
for date (${(k)files})
  echo tar zcvf $date.tar.gz ${(0)files[$date]}

Entfernen Sie es, echowenn Sie zufrieden sind.

Beachten Sie, dass die Monatsnamenabkürzungen ( %bStrftime-Format) in der Sprache des aktuellen Gebietsschemas angegeben werden ( Octauf einem englischen System, Oktauf einem deutschen usw.). Um unabhängig vom Gebietsschema des Benutzers immer englische Namen zu erhalten, erzwingen Sie das Gebietsschema Cmit LC_ALL=C zstat....

Mit GNU-Tools könnten Sie das Äquivalent wie folgt erreichen:

find . ! -name . -prune ! -name '.*' -printf '%Tb_%Td:%p\0' |
  awk -v RS='\0' -F : -v q=\' '
    function quote(s) {
      gsub(q, q "\\" q q, s)
      return q s q
    }
    {
      date=$1
      sub(/[^:]*:/, "", $0)
      files[date] = files[date] " " quote($0)
    }
    END {
      for (date in files)
        print "tar zcvf " quote(date ".tar.gz") files[date]
    }'

Wenn Sie zufrieden sind, geben Sie eine Pfeife an sh.

Antwort2

while read date a b filename; do 
    zip -g ../$date.zip "$filename"
done <<< $(stat -c "%y %n" *)

Antwort3

Wahrscheinlich habe ich die Frage falsch verstanden, aber

ls -ls |grep 'Okt 26' > oct26.list

gibt die Liste der Dateien für den 26. Oktober aus; dasselbe könnte z. B. mit Stunden gemacht werden, indem man zusätzlich grep "| grep 09:" usw. verwendet. Machen Sie dann mit der Liste oct26.list, was immer Sie brauchen.

verwandte Informationen