我一直在搜索执行一个简单的任务,即遍历文件夹路径并查找特定子文件夹名称中具有 .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/null
到2> /dev/null
.
或者只是使用zsh
:
ls -ld /root/disk/**/subfolder/*.summary(DoN)
没有区域设置问题,排序列表²,但请注意,如果disk
或subfolder
目录是目录的符号链接,则将遍历它们,如果文件列表太大,命令可能会失败(请参阅zargs
解决该问题)。
为了避免遍历subfolder
符号链接,您可以将其更改为:
ls -ld /root/dir/**/*.summary(DoNe['[[ $REPLY:h:t = subfolder ]]'])
使用e
val glob 限定符检查路径的 eadt
的 ail是否(从不遵循 zsh 中的符号链接)。h
subfolder
**/
与-exec ls -ld {} +
,ls
会按名称对作为参数接收的文件进行排序,但请注意,ls
如果文件数量非常大,则可能会多次调用,因此文件最终可能会以独立排序的批次显示。
² 这里我们使用oN
glob 限定符来对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"' {} \;