如何使 find 命令不以 ./ 作为结果前缀?

如何使 find 命令不以 ./ 作为结果前缀?

我只是 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 dir5find 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

相关内容