我想遍历所有文件夹及其子文件夹,并打印第一行包含字符串 CYCLE DATE(CYCLE 和 DATE 之间可能有空格和/或下划线)的 .TXT 文件(在子文件夹中)的名称。以下是我解决这个问题的尝试:
在 files_and_folders.sh 中我输入了以下内容:
#!/bin/bash
find . -name '*.TXT' -exec awk 'NR == 1 && $0 ~ /CYCLE[_ ]+DATE/ { print FILENAME }'
在 bash 命令行我输入了以下内容:
bash files_and_folders.sh
这产生了以下错误消息:
find: missing argument to -exec
正确的做法是什么?
我会像这样拆分这个问题:
CYCLE DATE
所以,
当然,
grep
您可以使用awk
来分析您的行,但坦率地说,这在这里没有必要那么复杂。您的正则表达式非常简单(CYCLE,然后是“空格”(至少一次),然后是 DATE),因此像 grep 这样的简单正则表达式引擎就可以完成这项工作。您的问题
find
在于您既没有使用';'
也没有'{}'
使用-exec
,因此find
无法理解它应该执行的命令在哪里完成(或者它应该把在执行调用时找到的文件放在哪里)。但由于这甚至不需要并且
find
可以完全不用,我个人认为for file in GLOB; do … done
比更容易记住find -name 'PATTERN' -exec Some complicated syntax '{}' ';'
。来自
find
手册页观察尾随的分号,你应该把它放在
{}
表示文件名的位置,因此要揭示*.TXT文件的路径,其中第一行与某些模式相匹配,可以这样做AWK
请注意,如果你有大文件,你可以通过指示 GNU在第一行之后停止处理行来加快该命令的速度。