为什么基本名称在这里不起作用

为什么基本名称在这里不起作用

为什么当我这样做时(我知道,这很愚蠢)它返回完整路径,而不仅仅是预期的文件名? ls -l | awk '{print $9}' | xargs -I% find ./my_dir -type f -name "%" -exec echo $(basename {}) \;

而且,是的,我知道,这很愚蠢,但目标是将 cp basename{} 到 {} (并且,在 and 中,我使用了循环for i in $(ls); do find ./my_dir -type f -name $i -exec cp $i {} \;; done

谢谢。

答案1

对于任何包含空格的文件名(例如this one.txt)或用户名或组名包含空格的任何系统(例如,加入 Active Directory 的系统),您的代码将失败。

构造for i in $(ls)不被使用。相反,请使用通配符 glob for i in *,.

最后直接回答你的问题$(basename {})。这$( ... )值不受单引号外壳的保护,因此对其进行求值命令被执行。结果$(basename {})很简单{},因此,

xargs -I% find ./my_dir -type f -name "%" -exec echo $(basename {}) \;

被解析并执行,就像您输入了这个一样,

xargs -I% find ./my_dir -type f -name % -exec echo {} \;

您可能正在寻找类似的东西

for i in *
do
    find ./my_dir -type f -name "$i" -exec cp "$i" {} \; -quit
done

不要忘记你应该总是$使用变量和表达式时用双引号引起来。 (公平地说,在这种情况下它不会有帮助,但这是你需要习惯做的事情。)

相关内容