bash移动隐藏文件,重置dotglob?

bash移动隐藏文件,重置dotglob?

我想移动所有文件,包括从点(隐藏)和文件夹(递归)开始。

所以我使用了以下命令

shopt -s dotglob nullglob
mv ~/public/* ~/public_html/

它起作用了。

但完成后我需要重置任何东西吗shopt -s dotglob nullglob?它不会改变命令的mv操作方式吗?因为我希望它改回来。

答案1

shopt -u nullglob dotglob是的,如果您希望在当前 shell 中恢复默认的通配行为,则必须随后取消设置这些选项(使用)。

你可以这样做

mv ~/public/* ~/public/.* ~/public_html/

显然,如果其中一个模式与任何内容都不匹配,那么在未设置的情况下仍然会生成错误nullglob,但无需设置任一选项即可工作。它可能还会说一些有关重命名失败的信息,.因为它是一个目录,但这也不能阻止它移动文件。

更好的选择可能是rsync在本地使用:

rsync -av ~/public/ ~/public_html/

然后删除~/public

答案2

只需取消它们:

shopt -u dotglob nullglob

don_crissti 提出了一个很好的观点,我将详细阐述。从问题中不清楚 dotglob 或 nullglob 是否是已经在运行之前设置shopt -s它们。因此,盲目地取消它们可能不是正确的选择重置去做。在子 shell 中设置它们将使当前 shell 的设置保持不变:

( shopt -s dotglob nullglob; mv ~/public/* ~/public_html/ )

答案3

这是重置选项的脚本:

shopt -q dotglob && SHOPT_DOTGLOBAL=true || SHOPT_DOTGLOBAL=false
shopt -s dotglob # include hidden file
echo *
"$SHOPT_DOTGLOBAL" || shopt -u dotglob

另一种方法是使用shopt -p打印命令:

SHOPT_DOTGLOBAL_RESET=$(shopt -p dotglob) || true
shopt -s dotglob # include hidden file
echo *
eval "${SHOPT_DOTGLOBAL_RESET}"

shopt -p dotglob如果未设置该选项,则会返回非零退出状态,如果该errexit选项打开,这将导致 shell 退出,因此|| true要防范它)。

答案4

shopt 所做的任何更改只会影响您运行该命令时正在运行的 shell。一旦你关闭 IE 外壳,更改就消失了。因此,除非您想长时间保持一个 shell 打开(有些人会这样做,使用screen或类似),否则您无需担心这一点。

就我个人而言,我按照 @Kusalananda 的建议使用 rsync

相关内容