2010-01-17 11:25:07 +0000 2010-01-17 11:25:07 +0000
32
32
Advertisement

どのようにtarディレクトリを削除し、ディレクトリを含むオリジナルを削除するには?

Advertisement

my_directory'というディレクトリ内のファイルの集まりをtarして、コマンドを使って元のファイルを削除しようとしているのですが、このコマンドはディレクトリ内の個々のファイルを削除するだけで、ディレクトリ自体を削除するものではありません。

tar -cvf files.tar my_directory --remove-files

しかし、それはディレクトリ内の個々のファイルを削除するだけで、ディレクトリ自体を削除するものではありません(これは私がコマンドで指定したものです)。何が足りないのでしょうか?

EDIT:

はい、「remove-files」オプションはかなりリテラルなものだと思います。私もマニュアルページではその点がよくわかりませんでした。(linuxではディレクトリとファイルをあまり区別しない傾向があり、同じものではないことを忘れてしまうこともあります)。ディレクトリを削除しないというのがコンセンサスのようです。

しかし、私がこの質問をした主な理由は、tar の絶対パスの扱いにあります。圧縮されるファイルへの相対パスを指定しなければならないので、適切に tar 化するためには親ディレクトリに変更しなければなりません。このような状況では、どんな種類の ‘rm’ コマンドを使用しても、潜在的に危険な可能性があります。そこで、私は tar 自体に削除を行わせることで、物事を単純化したいと考えていました。

例えば、バックアップするディレクトリ(つまり tar)がシェル変数として含まれているバックアップスクリプトを想像してみてください。シェル変数の値を誤って入力してしまった場合、結果として、最後に入っていたディレクトリのファイルが削除されてしまう可能性があります。

Advertisement
Advertisement

回答 (5)

19
19
19
2010-01-17 11:58:18 +0000

--remove-filesオプションは_ファイルを削除するだけなので、tarが0の終了ステータスを返した場合にのみディレクトリが削除されるように、

tar -cvf files.tar my_directory && rm -R my_directory

を試すことができます。

12
12
12
2010-01-17 11:42:11 +0000

--remove-files オプションが files をアーカイブに追加した後に削除するという部分を見逃しています。

find /path/to/be/archived/ -depth -type d -empty -exec rmdir {} のようなコマンドでアーカイブとファイル削除の操作を行うことができます。\


更新: この短い Debian の議論を読むと興味があるかもしれません。](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=424692).

7
Advertisement
7
7
2014-11-12 10:15:09 +0000
Advertisement

アーカイブ名の後に –remove-files ディレクティブをつけてみましたか?私の場合は正常に動作します。

tar -cvf files.tar --remove-files my_directory
1
1
1
2010-10-04 19:58:41 +0000
source={directory argument}
source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}
parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

 

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [$? != 0]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi

すると、次のような行に沿って何かを実行できます。

0x1& 0x1&

1
Advertisement
1
1
2011-11-14 13:21:38 +0000
Advertisement

これはおそらくバグだったのではないかと思います。

また、この場合の “file "という単語は曖昧です。しかし、これはコマンドラインスイッチなので、ディレクトリも意味するのではないかと予想します。(他の解釈ももちろん有効ですが、このような場合にディレクトリを保持することは意味がありません。私はそれを予期せぬ混乱した動作と考えるでしょう)。

しかし、いくつかのディストリビューションのgnu tarでは、gnu tarが実際にディレクトリツリーを削除していることがわかりました。ツリーを保持することがバグであることを示しています。あるいは、修正されるまでの間、少なくとも何らかの回避策があったのかもしれません。

これはubuntu 10.04のコンソールで試したものです。

mit:/var/tmp$ mkdir tree1 mit:/var/tmp$ mkdir tree1/sub1 mit:/var/tmp$ \> tree1/sub1/file1 mit:/var/tmp$ ls -la drwxrwxrwt 4 root root 4096 2011-11-14 15:40 . drwxr-xr-x 16 root root 4096 2011-02-25 03:15 .. drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 tree1 mit:/var/tmp$ tar -czf tree1.tar.gz tree1/ --remove-files # AS YOU CAN SEE THE TREE IS GONE NOW: mit:/var/tmp$ ls -la drwxrwxrwt 3 root root 4096 2011-11-14 15:41 . drwxr-xr-x 16 root root 4096 2011-02-25 03:15 .. -rw-r--r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz mit:/var/tmp$ tar --version tar (GNU tar) 1.22 Copyright © 2009 Free Software Foundation, Inc.

自分のマシンで見たい場合は、これを自己責任でコンソールに貼り付けてください:

tar --version cd /var/tmp mkdir -p tree1/sub1 \> tree1/sub1/file1 tar -czf tree1.tar.gz tree1/ --remove-files ls -la
Advertisement

関連する質問

6
10
5
37
16
Advertisement