n-Archives.net

attribコマンドでフォルダ配下全ファイルの属性変更ができない

目次

attribでフォルダ配下全ファイルの属性変更がうまくできない

フォルダのフルバックアップ時に、コピー元ファイル全てのアーカイブ属性をクリアしたいと考え、attribコマンドに /sオプション(サブディレクトリも含む)、/d(ディレクトリにも適用する)を付けてやってみたが思い通りに動かない。

例えば、D:\mydata\test 配下の全てのファイルの属性を表示しようとして、cdしてからattribをファイル指定なしで実行すると、

D:\mydata>cd test

D:\mydata\test>attrib /s /d
A                    D:\mydata\test\a\test.xlsx
A                    D:\mydata\test\a\test.txt
A                    D:\mydata\test\a\test
A                    D:\mydata\test\test.txt
                     D:\mydata\test\a
A                    D:\mydata\test\test
A                    D:\mydata\test\test.xlsx

ファイル・フォルダがたくさん表示される。これらがD:\mydata\test 配下に実際に存在するファイル・フォルダの全てです。ちゃんと整合しています。

ところが、attribコマンドを絶対パス指定で実行したいと思い、以下を実行してみると、

D:\mydata\test>attrib d:\mydata\test /s /d
A                    D:\mydata\test2\a\test
A                    D:\mydata\test2\test
A                    D:\mydata\test\a\test
A                    D:\mydata\test\test
                     D:\mydata\test

D:\mydata\test 配下にはたくさんファイルがあるはずなのに一部のファイルしか表示されません。それどころか、意図していない関係ないフォルダD:\mydata\test2の配下のファイルまで表示されています!このまま属性変更を行っていたら大変なことになっているところでした。

 

attribのファイル名の解釈方法

何が起こっているか全く分からず、とりあえず、Microsoftのattribコマンドリファレンスで調べてみたところ、attribのパラメータの定義は以下のように書かれています。

attrib [{+|-}r] [{+|-}a] [{+|-}s] [{+|-}h] [{+|-}i] [<Drive>:][<Path>][<FileName>] [/s [/d] [/l]]

もしかすると、絶対パス指定で渡すパラメータは、Drive, Path, FileNameの3つに分解されるということではないか?だとすると、今回の場合、

「D:\mydata\test」 は、

Drive = d:
Path = \mydata\
FileName = test

に分解される。

どうやら、"attrib d:\mydata\test /s /d" というコマンドは、「d:\mydata 配下(サブディレクトリ含む)全てについて、ファイル名またはフォルダ名が test であるものを選択する」と解釈されるらしい。このため、d:\mydata\test2 という関係ないと思われたフォルダ配下のtest というファイルやフォルダまでもが表示されてしまっていたようです。

いろいろとやってみた結果、今回やりたかったことを正しくコマンドにすると、

attrib d:\mydata\test\*.* /s /d

とするのが正解のようです。実際やってみると、

D:\mydata\test>attrib d:\mydata\test\*.* /s /d
A                    D:\mydata\test\a\test.xlsx
A                    D:\mydata\test\a\test.txt
A                    D:\mydata\test\a\test
A                    D:\mydata\test\test.txt
                     D:\mydata\test\a
A                    D:\mydata\test\test
A                    D:\mydata\test\test.xlsx

正しく表示されました。ファイル名に相当する部分の記述を明示的に指定する必要があるようです。例えば、

  • 全てのファイル・フォルダを対象にするなら *.*
  • 適用対象を絞りたいなら *.txt
  • 特定ファイル名を対象とするなら test.txt

などです。

 

ファイル名を指定しても注意が必要

ファイル名を指定した場合においても、やはり注意が必要です。d:\mydata\test\test.txt のみを選択しようとして、以下のように実行した場合です。

D:\mydata\test>attrib d:\mydata\test\test.txt /s /d
A                    D:\mydata\test\a\test.txt
A                    D:\mydata\test\test.txt

/s オプションが指定されているので、サブフォルダにある d:\mydata\test\a\test.txt も選択されてしまってます。

 

パスとファイル名のパラメータを分離すべきだと思うのですが、過去の歴史があり、変えられないのでしょうね。いずれにしても、普通の常識で考えられない動作となるので、十分注意が必要です。このような仕様を覚えることはできないので、今後は、attrib は、cdしてから、パス名省略で実行する、と覚えておくのが一番安全な気がします。

 

結論

  • attrib /s コマンドで、ファイル名を明記する場合、適用対象の「ファイル・フォルダ名部分」を必ず記述する必要がある。
  • attrib コマンドで、特定の1ファイルにのみ適用する場合は /s コマンドを指定しない。
  • attrib /s コマンドで特定フォルダ配下の全体に処理を行いたい場合、まずフォルダにcdしてから、attribを実行するのが安全。

 



【関連記事・関連コンテンツ】

 

コメントをお送りください
お名前:
コメント:
コメントの公開: