查找并将未隐藏文件重命名为点文件(隐藏文件)

时间:2020-02-19 16:07:32

标签: bash shell

在建立符号链接到我的主目录之后,我正在写我的dotfile,我想以树状结构查找未隐藏的文件。

for f in `find ../dotfiles -mindepth 2 -type f`; do ln -sfn "${f}" ".${f}"; done

但是此代码失败

enter image description here

1 个答案:

答案 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的输出进行迭代,该循环使用相同的定界符。这样一来,我们就可以确保不会因任何文件名中的意外字符而阻塞。

相关问题