我需要获取目录(.log/.lst
)中存在的文件()列表$logfolder
,其创建日期是特定的$year
并且$month
stat --format='%y %n' $logfolder/* |
grep "$year-$month-"|
awk -F' ' '{print $4}'|
grep 'log$\|lst$' > $archivepath/filesToArchive
当我向文件过多的文件夹查询命令时,这不起作用。我收到以下错误:
-bash: /usr/bin/stat: Argument list too long
答案1
对于一个有趣的可能性,如果您find
有手柄-newerXY
,请使用它!例如,要获取 1977 年 10 月的文件:
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "1977-10-01" \! -newermt "1977-10-01 +1 month"
完毕!
由于您已经有了变量year
并且month
可以直接写为:
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "$year-$month-01" \! -newermt "$year-$month-01 +1 month"
只有一个find
命令!惊人的!
答案2
我会这样做:
find "$logfolder" \( -name '*.log' -o -name '*lst' \) -printf "%TB\t%TY\t%p\n" |
awk '$1==m && $2==y' m="$month" y="$year" | cut -f 3-
解释
通过将两个-name
调用分组在括号中,您可以将它们与-o
(or) 标志组合起来。这将find
查找.log
或.lst
文件。 (GNU扩展-printf
)打印文件的修改月份 ( %TB
),然后打印其修改年份 ( %TY
),然后打印其路径 ( %p
),每个字段之间有一个制表符 ( \t
)。
只是awk
检查第一个字段(月份)是否与 相同$month
,第二个字段是否与 相同$year
。
删除cut
前两个字段(月份和年份)并打印第三个字段之后的所有内容。
$month
我通过创建 2012 年 12 月修改的文件(并设置为“12 月”和$year
2012 年)来测试上述内容:
$ touch -d "December 13 2012" {a,b,c}{.lst,.log}
$ touch c.lst a.log ## c.lst and a.log now have today's modification date.
$ find $logfolder \( -name '*.log' -o -name '*lst' \) -printf "%TB\t%TY\t%p\n" |
awk '$1==m && $2==y' m="$month" y="$year" | cut -f 3-
./b.log
./c.log
./b.lst
./a.lst
(请注意,它假设文件和目录名称不包含换行符)。
答案3
尝试这个:
find $logfolder -type f -exec stat --format='%y %n' "{}" + |
grep "$year-$month-"|
awk -F' ' '{print $4}'|
grep 'log$\|lst$' > $archivepath/filesToArchive
答案4
ls -lh *.log *.lst logfolder | grep year | grep month