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