请检查以下内容
awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
while IFS= read -r file; do find /OS/ -iname "$file.pdf" ; done
这会产生如下输出:
/OS/001DAY/11file/cooke.pdf
我们希望它只打印文件的路径,如下所示:
/OS/001DAY/11file/
答案1
有很多方法可以优化(例如,根据 的内容构建正则表达式Delete_Name.txt
并使用 -find
-iregex
而不是-name
,因此您只需运行find
一次而不是每行运行一次Delete_Name.txt
),但明显的错误是 $file 似乎不存在在任何地方定义 - 您将awk
输出读入$line
,而不是$file
.
也许尝试这样的事情:
awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
while IFS= read -r file; do
find /OS/ -iname "$file.pdf"
done | sed -e 's:[^/]*$/::'
(这可以全部在一行上,我只是将其分成多行以提高可读性并避免此网站上出现水平滚动条)
除了更正提到的错误之外,我还设置IFS=
并使用了-r
上的选项while read
,该选项将一次读取整行(即使该行包含空格或制表符)并将整行分配给 $file。
无论 .txt 中列出了多少个文件,以下find -regex
版本都仅运行一次。该选项需要 GNU 或 FreeBSD 版本。find
/MAC/Delete_Name.txt
find
-iregex
regexp=$(awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
sed -n -e '1,$H; ${ g; s/\n/\\|/g ; s/^\\|//p}')
find /OS/ -iregex ".*\($regexp\)\.pdf$" | sed -e 's:[^/]*$/::'
警告:如果 中有很多文件/MAC/Delete_Name.txt
,则构造的正则表达式将太大而无法容纳在单个命令行中,并且命令find
将失败。根据 shell、操作系统及其版本,每个 shell 命令行的限制可能是几千个字符。
答案2
您只需find
使用即可做到这一点-printf
。从man find
:
%h Leading directories of file's name (all but the last ele-
ment). If the file name contains no slashes (since it is
in the current directory) the %h specifier expands to
".".
所以:
awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt |
while IFS= read -r file; do find /OS/ -iname "$file.pdf" -printf "%h\n" ; done