Answers:
使用GNU awk
:
watch -x gawk '
FNR == 17 {nextfile}
ENDFILE {if (FNR) printf "%15s[%02d] %s\n", FILENAME, FNR, $0}' ./*
给出如下输出:
./file1[17] line17
./short-file2[05] line 5 is the last
请注意,./*
全局watch
调用一次仅扩展一次。
您watch head -n 17 *
是一个任意命令注入漏洞,因为该扩展*
实际上是由外壳程序解释为外壳程序代码,该外壳程序watch
调用以解释其参数与空格的连接。
如果$(reboot)
当前目录中有一个名为的文件,它将重新启动。
使用-x
,我们告诉watch
您跳过外壳程序并直接执行命令。或者,您可以执行以下操作:
watch 'exec gawk '\''
FNR == 17 {nextfile}
ENDFILE {if (FNR) printf "%15s[%02d] %s\n", FILENAME, FNR, $0}'\'' ./*'
用于watch
运行将./*
在每次迭代时扩展该glob 的shell 。watch foo bar
实际上与相同watch -x sh -c 'foo bar'
。使用时watch -x
,您可以指定所需的外壳,例如,选择一个更强大的外壳,例如zsh
可以进行递归遍历并限制为常规文件:
watch -x zsh -c 'awk '\''...'\'' ./**/*(.)'
没有gawk
,您仍然可以执行以下操作:
watch '
for file in ./*; do
[ -s "$file" ] || continue
printf "%s: " "$file"
head -n 17 < "$file" | tail -n 1
done'
输出如下:
./file1: line17
./short-file2: line 5 is the last
但这会降低效率,因为这意味着每个文件运行多个命令。
find . -exec
是这样的:D