![为什么基本名称在这里不起作用](https://linux22.com/image/208926/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9F%BA%E6%9C%AC%E5%90%8D%E7%A7%B0%E5%9C%A8%E8%BF%99%E9%87%8C%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
为什么当我这样做时(我知道,这很愚蠢)它返回完整路径,而不仅仅是预期的文件名?
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
不要忘记你应该总是$
使用变量和表达式时用双引号引起来。 (公平地说,在这种情况下它不会有帮助,但这是你需要习惯做的事情。)