フォルダのフルバックアップ時に、コピー元ファイル全てのアーカイブ属性をクリアしたいと考え、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の配下のファイルまで表示されています!このまま属性変更を行っていたら大変なことになっているところでした。
何が起こっているか全く分からず、とりあえず、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
正しく表示されました。ファイル名に相当する部分の記述を明示的に指定する必要があるようです。例えば、
などです。
ファイル名を指定した場合においても、やはり注意が必要です。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してから、パス名省略で実行する、と覚えておくのが一番安全な気がします。
RoboSync: RobocopyのためのGUIツール
本サイトで公開しているツールです。ダウンロードはこのバナーをクリック!
Version 1.3.27 をリリースしました! (2021/1/1)
RobocopyをGUIから実行できるようにするツールです。コマンドプロンプトを表示することなく、GUI画面からほぼマウス操作だけで実行までできます。
Robocopyがバックグラウンドでそのまま実行されますので設定に迷うことはありません。
・ 複数のコピー項目の作成と管理。
・ スクリプトファイル(バッチファイル)出力が可能。スケジューラによるバックグラウンド処理にも使えます。
・ Robocopyによるコピー実行前に、実行プレビュー(/L)、パラメータのチェック(/QUIT)が可能。
・ Robocopyのパラメータ設定の簡易チェック、Robocopy実行前の簡易チェックを行います。
・ Robocopy実行前後で実行するスクリプトを定義可能。
・ Robocopy実行途中での中断、実行ログの履歴管理と保存が可能。
【関連記事・関連コンテンツ】