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 zsh
wird 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, echo
wenn Sie zufrieden sind.
Beachten Sie, dass die Monatsnamenabkürzungen ( %b
Strftime-Format) in der Sprache des aktuellen Gebietsschemas angegeben werden ( Oct
auf einem englischen System, Okt
auf einem deutschen usw.). Um unabhängig vom Gebietsschema des Benutzers immer englische Namen zu erhalten, erzwingen Sie das Gebietsschema C
mit 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.