我的脚本确实有效,但脚本仅搜索其当前目录。我希望我的脚本在子目录中搜索文件。这是我目前所拥有的。
#!/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
我展示的标志方法已经足够了