有没有办法在命令find
中获取basename
?
我不需要的:
find /dir1 -type f -printf "%f\n"
find /dir1 -type f -exec basename {} \;
为什么呢?因为我需要继续使用found file
,我基本上想要这样的东西:
find . -type f -exec find /home -type l -name "*{}*" \;
并且它使用./file1
而不是file1
作为-name
的度量。
谢谢你的帮助:)
4条答案
按热度按时间but5z9lq1#
如果你有Bash 4.3或更高版本,试试下面的Shellcheck-clean pure Bash代码:
shopt -s ...
启用代码所需的一些Bash设置:dotglob
允许全局匹配以.
开始的文件和目录。默认情况下,find
显示此类文件。globstar
支持使用**
通过目录树递归地匹配路径。globstar
是在Bash 4.0中引入的,但在Bash 4.3(2014)之前使用它是危险的,因为它在查找匹配时遵循符号链接。nullglob
使glob在没有匹配项时扩展为空(否则它们扩展为glob模式本身,这在程序中几乎没有用)。${path##*/}
的解释,这总是有效的,即使在$(basename "$path")
不起作用的极少数情况下。printf
而不是echo
来输出找到的路径。?
、*
、[
、]
、\
),则此解决方案可以正常工作。nwlls2ji2#
生成一个shell,并从那里进行第二次调用
如果您的文件名称中可能包含特殊字符(如
[
、?
等),您可能需要像这样对它们进行转义以避免误报kb5ga3dv3#
你必须把它转发给另一个赋值器,在
find
中没有办法做到这一点。这回答了您关于尝试合并
%f
和-exec find
的功能的问题,并且基于您的示例,但是您的示例将原始文件名作为-name
模式注入,因此请避免这种情况,并考虑其他解决方案。xfb7svmp4#
只需生成一个
bash
shell:bash
部分中的$1
是由find
过滤的每个文件。