如何编辑一个脚本,该脚本调用find从作为参数传递的位置进行搜索?

时间:2019-03-24 14:06:12

标签: bash

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

编写一个脚本,该脚本借助awk扫描今天更改的所有文件,文件大小小于等于1Mbyte(小于或等于1Mbyte)。该脚本应从您指定的位置(脚本的参数)递归搜索所有文件,并将它们列出到stdout(终端)。

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

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

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

1 个答案:

答案 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'

当然,这意味着您的脚本将关闭与运行脚本所花费的时间一样多,因为在您运行脚本时时间不会停止。但这不太可能是一个严重的问题。