问候堆栈交换,
我的目标:执行ls
搜索整个目录结构并grep
搜索cats.py
.用于cat
读取文件cats.py
。我知道这听起来像是 Gnu/Linux 的诞生。
我目前对bash
Stack Exchange 还不熟悉,所以如果格式很糟糕,请原谅我。
我执行以下ls -R -l -t -r | grep cats
命令返回以下内容
rw-r--r-- 1 user user 2179 Mar 18 08:53 cats.py
我尝试使用 cat 读取上面返回的文件,但我遇到了如何为 grep 命令的结果分配占位符的问题,这是我尝试过的方法和结果。
ls -R -l -t -r | grep cats | cat cats.py
cat: cats.py: No such file or directory
我相信问题在于我执行 cat 函数的方式,应该类似于:
ls -R -l -t -r | grep cats | cat '{}'
或者
ls -R -l -t -r | grep cats && cat cats.py
答案1
find 命令会更合适:
find . -name 'cats.py' -exec cat {} \;
答案2
使用find
命令。它可以找到该文件,并对其运行命令。ls
有问题,特别是如果-l
给出了该选项,因为这样您的数据比您需要的多得多(文件模式,日期,所有者,...)。
即(替换 «» 中的位)
find «directory» -name '«file-name-glob-pattern»' -exec «command» {} \;
例如
find . -name 'cats.py' -exec cat {} \;
答案3
替代find -exec
,使用扩展通配符:
shopt -s extglob
cat **/cats.py
可选:取消设置 extglob 选项:
shopt -u extglob
请注意,这类似于-exec cat {} +
而不是-exec cat {} \;
第一个运行:
cat file1 file2 file3
后者运行:
cat file1
cat file2
cat file3
对于此示例,输出是相同的,但第一个运行速度更快。
答案4
这并不漂亮,但似乎符合您的要求。
cat `sudo ls -R -l -t -r | grep cats | awk '{print $9}'`
cat `sudo ls -R -l -t -r | grep `Local\ State` | awk '{print $9}'`