如何编辑调用 find 以从作为参数传递的位置进行搜索的脚本



我有一个家庭作业要我这样做:

编写一个脚本,在awk的帮助下,扫描今天更改的所有文件,大小<= 1MB(小于或等于(。脚本应从您指定的位置(脚本的参数(递归搜索所有文件,并将它们列在 stdout(终端(中。

到目前为止,我已经这样做了:

find . -type f -size +1M -exec stat -c '%X %n' {} ; 
  | sort -nr 
  | awk 'NR==1,NR==3 {print $2}'

我如何设法将路径作为脚本的参数并在终端中标准输出所有结果?我可能也不正确地完成了查找行?

你可以在 find 中完成整个事情(Linux 上的默认设置(。只需使用脚本的参数作为目标目录:

#!/bin/sh
find "$@" -type f -size -2M -mtime -1

$@将展开为参数列表。-size -2M的意思是"小于2M",但请注意,find将四舍五入到下一个单位。因此,1.1M 的文件被视为 2M,这就是为什么您想要 -2M 而不是 -1 .最后,-mtime -1仅查找过去 24 小时内修改的文件。

现在,如果你的老师希望你以某种方式把awk硬塞进去,你可以做这样的事情:

#!/bin/sh
find "$@" -type f -mmin -1440 -exec stat -c '%s %n' {} + |
  awk '$1<=1048576'

然后,使用目标目录作为参数运行脚本:

foo.sh /path/to/dir1 /path/to/dir2 ... /path/to/dirN

如果你的老师坚持用awk做整件事,你可以做:

#!/bin/sh
now=$(date +%s)
aDayAgo=$((now - 86400))
find "$@" -type f -mmin -1440 -exec stat -c '%s %X %n' {} + |
  awk -vaDayAgo="$aDayAgo" '$1<=1048576 && $2>=aDayAgo'

当然,这意味着您的脚本将偏离运行它所需的秒数,因为当您运行它时时间不会停止。但这不太可能是一个严重的问题。

最新更新