为什么当我这样做时(我知道,这很愚蠢)它返回完整路径,而不仅仅是预期的文件名?
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
不要忘记你应该总是$
使用变量和表达式时用双引号引起来。 (公平地说,在这种情况下它不会有帮助,但这是你需要习惯做的事情。)