我有一个作业要我这样做:
编写一个脚本,该脚本借助awk扫描今天更改的所有文件,文件大小小于等于1Mbyte(小于或等于1Mbyte)。该脚本应从您指定的位置(脚本的参数)递归搜索所有文件,并将它们列出到stdout(终端)。
到目前为止,我已经做到了:
find . -type f -size +1M -exec stat -c '%X %n' {} \; \
| sort -nr \
| awk 'NR==1,NR==3 {print $2}'
我如何设法将路径作为脚本的参数并在终端中输出所有结果?我做的查找行也可能不正确吗?
答案 0 :(得分:0)
您可以在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'
当然,这意味着您的脚本将关闭与运行脚本所花费的时间一样多,因为在您运行脚本时时间不会停止。但这不太可能是一个严重的问题。