我在一个名为的目录中有多个文件files
。我必须从此目录读取每个 .txt 文件:
abc123.txt
abc234.txt
abc345.txt
abc.txt
def123.txt
def234.txt
def345.txt
例如,当我./filter.sh abc
在终端中输入时,它会搜索.txt
名称包含 的文件abc
。
#!/bin/bash
input1=$1
find ./files -type f -name "*$input1*.txt"
我的输出看起来像这样
./files/abc345.txt
./files/abc234.txt
./files/abc123.txt
./files/abc.txt
我这样做对吗?还有,是否可以不显示./files/
在输出中?为什么我的输出显示abc345
, abc234
,abc123
而不是abc123
, abc234
, abc345
?
答案1
是的,这很好。但是当你对 更加熟悉时
find
,你会直接在命令行上执行此操作(而不是通过 shellscript)。我经常使用 shellscript,但主要用于较大的任务(多个命令行)。您可以删除发现它的起点:
find ./files -type f -name "*$input1*.txt" -printf "%P\n"
最后你可以对文件进行排序:
find ./files -type f -name "*$input1*.txt" -printf "%P\n" | sort
如果数量少或文件小,你可以用以下方法将内容写入终端
find ./files -type f -name "*$input1*.txt" -exec echo "--- {}:" \; -exec cat {} \;
输出可以通过以下方式重定向到文件
> output.txt
find ./files -type f -name "*$input1*.txt" -exec echo "--- {}:" \; -exec cat {} \; > output.txt
水平滚动即可看到此行的末尾。
如果文件很多或者文件很大,最好用 less 或者你最喜欢的文本编辑器来查看文件,
find ./files -type f -name "*$input1*.txt" -exec less {} \;
并在每个文件之间使用 less 的 'q' 退出。
find
相对ls
find
是一种先进的工具它可以 [递归] 在目录树中查找文件,并且有很多选项。要花很长时间才能学会用它做什么。查看man find
或可能更简单,通过互联网查看教程。ls
是一个更简单的工具,列出一个目录级别的文件,通常是当前级别。它也有很多选项,但相当易于通过命令行使用。请注意,ls
在 shellscript 中,这可能会造成混淆,尤其是与其他命令结合使用时。请参阅man ls
。
答案2
您可以这样做并按照@sudodus 的建议来改善输出。
但是find
对于您的用例来说有点过度,您可以简单地使用ls
:
ls -1 files/abc*
获取目录名称:
(cd files && ls -1 abc*)