在 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
),并且如果输入位于剪辑之前,则打印该行(否则不打印)。
要按月份进行剪辑,请更改%d
为00
排除四个月前的月份,或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/red
PI Server 从中获取该文件进行读取的目录中。
请根据您的方便更改文件夹名称。现在,/home/avinash
您需要在文件夹中保留一个名temp
为此文件的文件,该文件将仅包含一个单词或任何符号hi
。 temp 的用途是收集脚本已传输到 PI 文件夹的所有文件名。因此,如果脚本已传输文件,例如ABC_20110725.txt
和DEF_20110725.txt
,tmp
则将包含内容
答案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 ...