在建立符号链接到我的主目录之后,我正在写我的dotfile,我想以树状结构查找未隐藏的文件。
for f in `find ../dotfiles -mindepth 2 -type f`; do ln -sfn "${f}" ".${f}"; done
但是此代码失败
答案 0 :(得分:1)
仔细查看错误日志,find
抱怨.../dotfiles/rest/of/the/path
之类的路径,其中三个前导点是.${f}
扩展的结果。由于您说过要在主目录中进行复制,因此所需的扩展名应为~/.path
(或者假设您正在从主目录执行./.path
,则find
也可以使用)。 / p>
该问题的解决方案是使用basename
从完整文件路径中删除前导目录:
for f in `find ../dotfiles -mindepth 2 -type f`; do
filename="$(basename "$f")"
ln -sfn "${f}" "~/.$filename"
done
但是,对find
的输出进行迭代的方式易于突破IFS:例如,如果匹配的文件之一包含空格,则它将作为两个不同的元素进行迭代。我们也可以修复该问题:
find ../dotfiles -mindepth 2 -type f -print0 | while IFS='' read -r -d $'\0' f; do
filename="$(basename "$f")"
ln -sfn "${f}" "~/.$filename"
done
在此代码中,我们使用find
的{{1}}操作用ASCII NUL -print0
分隔结果,该ASCII NUL在文件名中找不到。然后,我们使用一个\0
循环对find
的输出进行迭代,该循环使用相同的定界符。这样一来,我们就可以确保不会因任何文件名中的意外字符而阻塞。