我想移动所有文件,包括从点(隐藏)和文件夹(递归)开始。
所以我使用了以下命令
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