bashで隠されたファイルを移動してdotglobをリセットしますか?

bashで隠されたファイルを移動してdotglobをリセットしますか?

開始点(隠し)とフォルダ(繰り返し)を含むすべてのファイルを移動したいです。

だから私は次のコマンドを使用しました。

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

効果がありました。

しかし、作業を終えた後にリセットする必要がありますかshopt -s dotglob nullglob?コマンドの動作方法が変わりませんかmv?なぜなら、もう一度変えたいからです。

答え1

shopt -u nullglob dotglobはい、現在のシェルからデフォルトのグロービング動作を復元するには、後でこれらのオプションを無効にする(有効にする)必要があります。

あなたはこれを行うことができます

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

明らかに、パターンの1つが何も一致しない場合、設定されていない場合はまだエラーが発生しますnullglobが、両方のオプションのいずれかを設定しなくても機能します。ディレクトリなので、名前変更が失敗したという内容があるかもしれませんが、.それでもファイルの移動が中断されるわけではありません。

より良いオプションはrsyncローカルで使用することです。

rsync -av ~/public/ ~/public_html/

その後、削除してください~/public

答え2

キャンセルしてください。

shopt -u dotglob nullglob

don_crisstiが良い指摘をしましたが、これについて詳しく説明します。 dotglob か nullglob が何であるかは質問では明確ではありません。すでに実行する前に設定してくださいshopt -s。したがって、盲目的にキャンセルすることは正しい選択ではないかもしれません。初期化します。サブシェルで設定すると、現在のシェルの設定は変更されません。

( 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別の方法はprintコマンドを使用することです。

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

shopt -p dotglobこのオプションが設定されていない場合はゼロ以外の終了ステータスが返されます。errexitこのオプションがオンの場合はシェルは終了します。|| true注意してください。)

答え4

shopt によるすべての変更は、コマンドの実行時に実行中のシェルにのみ影響します。 IEシェルを閉じると、変更は消えます。したがって、長い間シェルを開いたままにしたくない限り(一部の人はそうしたり、使用したり、screen類似したりする)ことを心配する必要はありません。

個人的に私は@Kusalanandaが提供するようにrsyncを使用します。

関連情報