如何使用命令行参数查找具有通用名称的 .txt 文件

如何使用命令行参数查找具有通用名称的 .txt 文件

我在一个名为的目录中有多个文件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, abc234abc123而不是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*)

相关内容