如何在 shell 脚本中使用“find”从当前目录以及最重要的子目录中进行搜索?

如何在 shell 脚本中使用“find”从当前目录以及最重要的子目录中进行搜索?

我的脚本确实有效,但脚本仅搜索其当前目录。我希望我的脚本在子目录中搜索文件。这是我目前所拥有的。

#!/bin/bash
read -p "file name:" fname
if find . -name "$fname"
        then
        cat -n $fname
else
        echo "file not found, try again. But, this time focus please!"
fi

答案1

默认情况下,find会搜索子目录,以便您朝着正确的方向前进。

if使用返回代码来find决定是否找到任何内容,但这不是find返回代码的含义。find如果在搜索文件时没有遇到错误,则返回 true。

如果您想检查是否find真正找到文件,请检查它是否在标准输出上打印了一些内容:

find_stdout=`find . -name "$fname"`
if [ "$find_stdout" != "" ]; then
    # Found file(s) case
else
    # Found nothing case
fi

答案2

你的脚本可以简化。find命令本身有-exec 标志,允许执行命令对找到的文件进行操作。

另外,如果你想要查找特定文件,则不需要脚本。以下是示例:

$ cat testdir/file2.txt                                                        
HelloAskubuntu
$ find  -name "file2.txt" -exec cat {} \; 2> /dev/null                         
HelloAskubuntu

如您所见,这会file2.txt在我当前工作目录的子目录中找到特定文件,并将cat其保存。

如果您想要查找文件名中包含某些内容的一组文件,则可以使用-regex标志或简单的通配符。

$ find  -name "file*.txt" -printf "%P:\n"  -exec cat {} \; 2> /dev/null        
file1.txt:
HelloAskubuntu
testdir/file2.txt:
HelloAskubuntu

注意使用-printf标志首先打印找到的文件路径,然后对其进行 catinate。

find有关其标志和选项的更多信息,请参阅手册页

此外,就其本身而言,您的脚本是不正确的:您基本上是在进行测试if command find successfully exits, catinate "$fname"。您没有告诉find对找到的文件执行任何操作,也没有将其输出传递给任何其他命令进行操作。

如果你坚持使用 read+find,我仍然建议你使用-exec标志,或者至少将输出传递给 while 循环

$ cat testscript.sh                                                            
#!/bin/bash

read -p"Enter filename:" FILE
find -name "$FILE" -exec cat {} \; 2> /dev/null
$ ./testscript.sh
Enter filename:file2.txt
HelloAskubuntu
$ 

这是另一种方法:

$ ./testscript.sh                                                              
Enter filename:file2.txt
./testdir/file2.txt
HelloAskubuntu
$ cat testscript.sh
#!/bin/bash

read -p"Enter filename:" USERINPUT

find -name "$USERINPUT" -print0  2>/dev/null  | while IFS="" read -r -d "" FILE;
do
  echo "$FILE"
  cat "$FILE"
done
$ 

上述方法是处理文件名的更通用的方法,特别适用于避免文件名称中包含特殊字符的问题然而,对于你在这里做的 90% 的事情来说,-exec我展示的标志方法已经足够了

相关内容