按日期

时间:2016-10-29 15:45:42

标签: bash file ls

我有一个每天都有文件的目录。现在我想按日期压缩这些文件。无论如何要分组/列出在同一日期登陆的文件。

假设目录中有以下文件

-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

2 个答案:

答案 0 :(得分:2)

如果您拥有date命令的GNU版本,则可以使用-r标志获取修改文件的日期,这可能非常有用。 例如,根据您问题中的文件列表,date +%b_%d -r hello.txt将输出Oct_14

使用它,你可以遍历文件,并建立tar文件:

  • 如果tar文件不存在,请使用单个文件
  • 创建它
  • 如果tar文件存在,请将文件添加到其中
  • 循环后,压缩tar文件

像这样:

#!/usr/bin/env bash

tarfiles=()

for file; do
    tarfile=$(date +%b_%d.tar -r "$file")
    if ! [ -f "$tarfile" ]; then
        tar cf "$tarfile" "$file"
        tarfiles+=("$tarfile")
    else
        tar uf "$tarfile" "$file"
    fi
done

for tarfile in "${tarfiles[@]}"; do
    gzip "$tarfile"
done

将要存档的文件列表作为命令行参数传递,例如,如果/path/to/files是要存档文件的目录(在问题中列出),则将此脚本保存在{{1那么你可以像这样使用:

~/bin/tar-by-dates.sh

答案 1 :(得分:0)

创建(Month_Day.tar FILENAME )对的零分隔列表,并使用 xargs 将每个文件添加到相应的存档中:

find . -maxdepth 1 -mindepth 1 -type f -printf "%Tb%Td.tar\0%f\0"|xargs -n 2 -0 tar uf