使用绝对路径查找并列出特定搜索

使用绝对路径查找并列出特定搜索

我一直在搜索执行一个简单的任务,即遍历文件夹路径并查找特定子文件夹名称中具有 .summary 扩展名的所有文件,并作为 ls 命令详细信息返回,但具有文件的绝对路径。

这是磁盘结构:-

-root--disk--folder1--subfolder--a.summary  
-root--disk--folder2--subfolder--b.summary  
-root--disk--folderX--subfolder--X.summary  

这是我所拥有的:-

ls -lR | grep summary  
-rw-r-----  1 username group 14150 Sep  8 22:41 a.summary  
-rw-r-----  1 username group 10150 Sep  9 22:41 b.summary  

我希望得到这个结果

-rw-r-----  1 username group 14150 Sep  8 22:41 /root/disk/folder1/subfolder/a.summary  
-rw-r-----  1 username group 10150 Sep  9 22:41 /root/disk/folder2/subfolder/b.summary  

如果有许多路径存在权限被拒绝问题,是否有更快的方法完成任务?

答案1

find /root/disk -path '*/subfolder/*.summary' -exec ls -ld {} +

(请注意,在某些find实现中,假设文件路径是当前语言环境中的有效文本)

请注意,它将.summary在名为 的目录中查找文件subfolder,也会在这些目录的子目录中查找文件,*s 可以跨越/上面的字符-path。要排除子目录中的文件,您可以添加一个! -path '*/subfolder/*/*',但它也会排除/root/disk/subfolder/foo/subfolder/a.summary例如。某些find实现有一个 来-regex匹配带有正则表达式的路径,您可以在其中使用-regex '.*/subfolder/[^/]*\.summary'.

通过多种find实现,您可以使用稍微不同的输出格式-ls来代替(并且不对文件路径进行排序)。-exec ls -ld {} +

要隐藏有关无法访问目录的错误,您可以将错误重定向/dev/null2> /dev/null.

或者只是使用zsh

ls -ld /root/disk/**/subfolder/*.summary(DoN)

没有区域设置问题,排序列表²,但请注意,如果disksubfolder目录是目录的符号链接,则将遍历它们,如果文件列表太大,命令可能会失败(请参阅zargs解决该问题)。

为了避免遍历subfolder符号链接,您可以将其更改为:

ls -ld /root/dir/**/*.summary(DoNe['[[ $REPLY:h:t = subfolder ]]'])

使用eval glob 限定符检查路径的 eadt的 ail是否(从不遵循 zsh 中的符号链接)。hsubfolder**/


-exec ls -ld {} +,ls会按名称对作为参数接收的文件进行排序,但请注意,ls如果文件数量非常大,则可能会多次调用,因此文件最终可能会以独立排序的批次显示。

² 这里我们使用oNglob 限定符来对glob 中的列表进行N排序o,作为地面上的优化,ls无论如何它都会进行自己的排序。

答案2

要获取以 结尾的文件extension,其父目录应该是名为 的目录subfolder

find . -type d -name subfolder -exec sh -c 'ls -l "$0"/*.extension' {} \;

或者您可以使用 execdir 选项

find . -type f -name '*.extension' -execdir bash -c '[ "$(basename "$PWD")" == "subfolder" ] && echo "$PWD/$0"' {} \;

相关内容