我只是 shell 脚本的初学者。
通过运行下面的命令,我得到如下输出
$ cd demo
$ ls
dir1 dir2 dir3 dir4 dir5
$
$find . -mtime -2 -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4|dir5)/.+" -exec ls {} \; > /tmp/basefileslist
./dir1/demo1.sh
./dir2/demo2.sh
./dir3/demo3.sh
./dir4/demo4.sh
./dir5/demo5.sh
我应该在没有的情况下得到输出./
——我想像下面这样
dir1/demo1.sh
dir2/demo2.sh
dir3/demo3.sh
dir4/demo4.sh
dir5/demo5.sh
您可以修改
find
命令./
以使用特定于 GNU 的(但您-regextype
也是特定于 GNU 的)-printf
谓词而不是-exec
. 这是一个示例命令,它应该为您提供所需的输出:在此命令中,
-printf '%P\n'
谓词用于打印 找到的每个文件的相对路径find
,不带前导./
前缀。格式%P
说明符指定相对路径(相对于您告诉它从中开始的目录,此处.
),并\n
指定每个路径应在新行上打印。运行此命令后,输出应类似于以下内容:
in
./
find 的输出来自.
选项之前的参数。更改.
参数会更改您关注的输出部分。根据您的示例,这将产生您要求的输出:我排除了正则表达式选项,因为我猜想它们会重复指定子目录参数的操作。输出是:
在您的特定测试用例中(只有五个匹配的子目录),您可以将子目录列表缩减为一个简单的 shell glob:
或者更短的球体:
在许多用例中,使用
find dir1 dir2 dir3 dir4 dir5
或find dir?
找不到像这样的所需文件。但我回答的重点是展示选项之前的参数将如何影响 find 输出中的路径。