tar --remove-files -cvf ARCHIVE.tar DIRECTORY
って、ディレクトリをアーカイブしてからその中のファイルをアーカイブするから、まだ中のファイルが残っている時点でディレクトリを削除することはできない。それゆえ、実行後、ディレクトリが残ってしまうのは、仕方がない
と思ってたんだけど、なんか、こんな記事を見つけてしまった。
- #424692 - --remove-files complains that directories "changed as we read it" - Debian Bug report logs
--remove-files bug was fixed in tar-1.19.
え、バグだったの?ちょっと Windows10 で試してみた。
標準の tar (C:\WINDOWS\system32\tar.exe)は BSD tar なので、--remove-files を持っている GNU tar で試さなきゃいけない。scoop install tar
でインストールしてみると、
$ scoop\shims\tar.exe --version tar (GNU tar) 1.23 Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by John Gilmore and Jay Fenlason.
よしよし。では a ディレクトリ以下を tar アーカイブへ移動してみよう
scoop/shims/tar.exe --remove-files -cvf a.tar a/
あ、ちゃんと a フォルダーや、a の下のサブディレクトリも消えた。マジでバグだったのか?
ただ、リンク先を見ると、ファイルがアーカイブされている間に変更があった時に警告を出す処理で、ディレクトリまで対象になってたから例外にしたような修正みたいな書き方になってる。ということは、もっと前のバージョンで直ってたのかなぁ。よく分からない
ところで、zip -m の場合は、アーカイブファイルを全部作ってから、ファイル・ディレクトリを削除するので、ディレクトリが残るという問題もないし、途中で中断した場合なんかも確か元ファイルが消されることはなかったように思う(たぶん)
だが、tar --remove-files は、アーカイブした尻からファイルを削除するので、途中でうっかり中断して、再実行したりすると、ファイルの一部が完全に失われてしまう事故が発生する。なので、あんまり tar --remove-files は使わない方がよい。
(実際、学生の頃に事故った。まぁ、卒論提出後だったので、実害はなくてたすかったが…)