menu-icon

mv等のコマンドでワイルドカード指定の際、隠しファイルを対象にする

mv等のコマンドでワイルドカード(*)指定を行った際、デフォルトの設定では隠しファイル(ファイル名が.で始まるファイル)は対象になりません(正確にはファイル名展開の結果に隠しファイルが含まれません)。shoptコマンドを使用して、シェルオプションを変更し、隠しファイルを対象にする方法のメモです。

shoptコマンド

シェルオプションを設定するためのコマンドです。-sでオプションを有効に、-uでオプションを無効にします。

$ shopt --help
shopt: shopt [-pqsu] [-o] [optname ...]
    Set and unset shell options.
    
    Change the setting of each shell option OPTNAME.  Without any option
    arguments, list each supplied OPTNAME, or all shell options if no
    OPTNAMEs are given, with an indication of whether or not each is set.
    
    Options:
      -o	restrict OPTNAMEs to those defined for use with `set -o'
      -p	print each shell option with an indication of its status
      -q	suppress output
      -s	enable (set) each OPTNAME
      -u	disable (unset) each OPTNAME
    
    Exit Status:
    Returns success if OPTNAME is enabled; fails if an invalid option is
    given or OPTNAME is disabled.

今回はdotglobというオプションを有効にします。以下、gnu.orgから引用です。

dotglob

If set, Bash includes filenames beginning with a ‘.’ in the results of filename expansion. The filenames ‘.’ and ‘..’ must always be matched explicitly, even if dotglob is set.

gnu.org

dotglobを有効にすることで、ファイル名展開の結果に隠しファイルが含まれるようになります。それでは動作を検証してみます。

検証

実際にmvコマンドで動作を確認します。以下の構成を初期状態とします。

src/
  normal
  .hidden
dist/

dotglob offの場合

隠しファイルである.hiddenが移動されません。

$ shopt -u dotglob
$ mv src/* dist/
$ ls -a src dist
dist:
.  ..  normal

src:
.  ..  .hidden

dotglob onの場合

.hiddenも移動されました。

$ shopt -s dotglob
$ mv src/* dist/
$ ls -a src dist
dist:
.  ..  .hidden  normal

src:
.  ..

まとめ

shoptコマンドを使用して、隠しファイルをワイルドカード指定の際の対象にする方法でした。