“/usr/bin/stat:参数列表太长”错误

“/usr/bin/stat:参数列表太长”错误

我需要获取目录(.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 月”和$year2012 年)来测试上述内容:

$ 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

相关内容