web-dev-qa-db-ja.com

ディレクトリをtarし、ディレクトリを含むオリジナルを削除する方法は?

'my_directory'というディレクトリにあるファイルのコレクションをtarしようとしています。次のコマンドを使用して、元のファイルを削除します。

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

ただし、削除されるのはディレクトリ内の個々のファイルのみで、ディレクトリ自体は削除されません(これはコマンドで指定したものです)。ここで何が欠けていますか?

編集:

はい、 'remove-files'オプションはかなりリテラルだと思います。私もその点でmanページが不明確だったのに。 (Linuxでは、ディレクトリとファイルをあまり区別しない傾向があり、時には同じではないことを忘れています)。コンセンサスはディレクトリを削除しないということです。

ただし、この質問をするための私の主要な促進点は、タールの絶対パスの処理に由来します。圧縮するファイルへの相対パスを指定する必要があるため、正しく圧縮するには、親ディレクトリに移動する必要があります。私が見るように、あらゆる種類の後続の「rm」コマンドを使用すると、その状況では潜在的に危険です。したがって、tar自体に削除を行わせることで、物事を簡素化することを望んでいました。

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

33
Nicholas

--remove-filesオプションがアーカイブに追加した後ファイルを削除することを示す部分がありません。

次のようなコマンドを使用して、アーカイブとファイルの削除操作を追跡できます。

/ path/to/be/archived/-depth -type d -empty -exec rmdir {} \;を見つけます。


更新:この短いDebianディスカッションを読むことに興味があるかもしれません、
Bug 424692:--remove-filesは、「読み取り時にディレクトリが変更された」と不平を言います

13
nik

--remove-filesオプションのみファイルを削除、あなたは試すことができます

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

tarが終了ステータス0を返した場合にのみ、ディレクトリが削除されるようにします

21
pavium

アーカイブ名の後に--remove-filesディレクティブを付けようとしましたか?わたしにはできる。

tar -cvf files.tar --remove-files my_directory
7
Robert Grubba

これはおそらくバグでした。

また、この場合、「ファイル」という単語はあいまいです。しかし、これはコマンドラインスイッチであるため、ディレクトリも意味すると思います。unix/ lnuxでは、すべてがファイルであり、ディレクトリでもあるからです。 (他の解釈ももちろん有効ですが、そのような場合にディレクトリを保持することは意味がありません。予想外の混乱を招く動作だと思います。)

しかし、一部のディストリビューションのgnu tarでは、gnu tarが実際にディレクトリツリーを削除することがわかりました。ツリーを維持することはバグであったことを示すもう1つの兆候です。または、少なくとも修正するまでの回避策。

これは私が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ルートルート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 
 
#ツリーが見えるのでIS GONE NOW:
 
 mit:/ var/tmp $ ls -la 
 drwxrwxrwt 3 root root 4096 2011-11-14 15:41。
 drwxr-xr-x 16ルートルート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 
著作権©2009フリーソフトウェアFoundation、Inc。
 

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

 tar --version 
 cd /var/tmp
mkdir -p tree1/sub1 
> tree1/sub1/file1 
 tar -czf tree1 .tar.gz tree1/--remove-files 
 ls -la 
1
mit
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
1
shellking