查找并打印文件路径,不带文件名

查找并打印文件路径,不带文件名

请检查以下内容

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.txtfind-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 

相关内容