Получить список файлов, сгруппированных по дате

Получить список файлов, сгруппированных по дате

У меня есть каталог с файлами, которые приходят каждый день. Теперь я хочу сжать эти файлы, сгруппировав их по датам. Есть ли способ сгруппировать/перечислить файлы, которые приземлились в одну и ту же дату.

Предположим, что в каталоге есть следующие файлы:

-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

Так что нет способа сгруппировать файлы с любым суффиксом/префиксом, так как все они уникальны. Теперь, когда я запущу команду, которую ищу, я получу набор строк, как показано ниже, на основе группировки по датам.

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

С помощью этого списка я пройдусь и создам архив

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

решение1

С помощью zsh, используя ассоциативный массив, ключами которого являются даты, а значениями — список файлов, разделенных символом NUL, которые были последний раз изменены в эту дату:

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]}

Удалите, echoкогда будете счастливы.

Обратите внимание, что сокращения названий месяцев ( %bформат strftime) будут на языке текущей локали ( Octв английской системе, Oktв немецкой и т. д.). Чтобы всегда использовать английские названия независимо от локали пользователя, принудительно установите локаль с Cпомощью LC_ALL=C zstat....

С помощью инструментов GNU вы можете сделать то же самое:

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]
    }'

shКогда вы счастливы, пойте .

решение2

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

решение3

Возможно, я неправильно понял вопрос, но

ls -ls |grep '26 октября' > oct26.list

выдаст список файлов на 26 октября; то же самое можно сделать, например, с часами, используя дополнительную команду grep "| grep 09:" и т. д. Затем сделайте со списком oct26.list все, что вам нужно.

Связанный контент