不到 3 个月前的 Linux tar 文件,文件名中使用日期

不到 3 个月前的 Linux tar 文件,文件名中使用日期

在 Linux 中,我有文件名以日期 YYYYMMDD 开头的文件

20160201_001.pdf
20160110_002.pdf
20150201_003.pdf
20140201_004.pdf

我想压缩那些小于以下日期范围的文件(不使用 mtime,而是使用文件名期间)

date +'%Y%m' -d '4 months ago'  (201511)

基本上我想做

files=($(find . -name filename< date +'%Y%m' -d '4 months ago'))
tar cvfz backup.tar.gz "${files[@]}"

文件压缩的​​预期结果:

20150201_003.pdf
20140201_004.pdf

我怎样才能做到这一点?

答案1

使用该日期格式,您可以在 中使用字符串排序awk,例如:

files=( $(ls | awk -v d=$(date -d '4 months ago' +%Y%m%d_999.pdf) '$1<d {print;}') )
tar cvfz backup.tar.gz "${files[@]}"

awk程序读取输入行,并将其规则应用于它们。在这种情况下,它首先使用变量d集调用,因为剪辑日期扩展为文件名。然后,对于每一行,它都会按字母顺序比较第一个单词 ( $1) 和剪辑日期 ( d),并且如果输入位于剪辑之前,则打印该行(否则不打印)。

要按月份进行剪辑,请更改%d00排除四个月前的月份,或99包括四个月前的月份。

答案2

请根据您的要求检查此脚本。希望这对你有用。根据您的要求更改它

lines=`expr 0 + 0`
maxlines=`expr 0 + 100`
while [ 1 -le 5 ] ; do
     d=`date +%G%m%d`
     count=`ls -1 | grep $d |wc -l`
     c=`expr $count + 0`
     while [ $c -gt 0 ]; do
          file=`ls -1 | grep $d |tail -$c |head -1`
          searchFile=`grep $file tmp | head -1 | wc -l`
          searchFile=`expr $searchFile + 0`
          if [  $searchFile -eq 0 ]; then
               cp $file /home/avinash/f
               echo $file >>tmp
               lines=`expr $lines + 1`
          fi 
          c=`expr $c - 1`
     done     
     if [ $lines -gt $maxlines ]; then 
            k=`date +%G%m`
          grep $k tmp > t
          mv -f t tmp
          lines=`expr 0 + 0`
     fi     
done

该脚本将根据服务器时间仅选择今天的文件。该脚本正在无限循环中运行。

因此,每当目录中有新文件时,它都会检查文件名,如果名称包含今天日期,则会将该文件放入home/avinash/redPI Server 从中获取该文件进行读取的目录中。

请根据您的方便更改文件夹名称。现在,/home/avinash您需要在文件夹中保留一个名temp为此文件的文件,该文件将仅包含一个单词或任何符号hi。 temp 的用途是收集脚本已传输到 PI 文件夹的所有文件名。因此,如果脚本已传输文件,例如ABC_20110725.txtDEF_20110725.txttmp则将包含内容

答案3

这是一种方法:

$ files=( $(d=$(date +'%Y%m' -d '4 months ago'); 
          for f in *.pdf; do [[ "${f:0:6}" -le "$d" ]] && 
                             printf '%s\n' "$f"; done;) )
$ tar cvzf backup.tgz "${files[@]}"
20140201_004.pdf
20150201_003.pdf

解释

  • d=$(date +'%Y%m' -d '4 months ago'):将变量设置$d为所需的日期。
  • for f in *.pdf; do ... ; done:迭代.pdf目录中的所有文件,将每个文件保存为$f.
  • [[ "${f:0:6}" -le "$d" ]]:检查文件名的前6个字符是否小于或等于 的值$d
  • && printf '%s\n' "$f"; done;:如果是,则打印文件名。
  • files=( $( ... ) ):将上面的输出保存在数组中$files

请注意,这假设您的所有pdf文件名都以至少 6 位数字开头,如果不是,则会抱怨。您可以通过仅迭代那些执行以下操作的 pdf 文件来使其更加健壮:

for f in [0-9][0-9][0-9][0-9][0-9][0-9]*.pdf; do ...

相关内容