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


30

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

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

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

編集:

はい、「remove-files」オプションはかなり文字通りだと思います。私もその点でマニュアルページが不明瞭だと思ったが。(Linuxでは、ディレクトリとファイルをあまり区別しない傾向があり、同じものではないことを時々忘れます)。コンセンサスは、ディレクトリを削除しないということです。

ただし、この質問をするための私の主要なプロンプトポイントは、tarの絶対パスの処理に由来します。圧縮するファイルへの相対パスを指定する必要があるため、適切にtarするために親ディレクトリに変更する必要があります。私が見るように、あらゆる種類の後続の「rm」コマンドを使用すると、そのような状況では潜在的に危険です。したがって、tar自体に削除を行わせることで物事を単純化したいと考えていました。

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


ニコラス、追加の手順でディレクトリツリーを削除する必要があるという危険性が加わるという点は絶対に有効です。アーカイバーがこれを安全に行うことは可能だと思います。また、これはGNU tarの作成者の意図であったと信じています。少なくともそうすべきだったはずです;-)
mit

2
--remove-filesオプションは、少なくとも一部のプラットフォーム/一部のバージョンでは-私の場合、実際には含まれているディレクトリを削除することがわかりました。場合によっては、tarされた後に一部のファイルが変更されたため、残りのディレクトリが完全に空ではなかった可能性があります。
isync

@isync Ubuntu 14.04で--remove-filesがディレクトリを削除しているようです。私の場合を除いて、私はそれを望んでいません。ハハ
ブラッドリー・オデル

回答:


12

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

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

find / path / to / be / archived / -depth -type d -empty -exec rmdir {} \;


更新:この短いDebianの議論を読むことに興味があるかもしれません。
バグ424692:--remove-filesは、「読むとディレクトリが変更された」と文句を言います


たぶん実際には:作業を開始する-c前にディレクトリを変更しますtar(そして完了するまでは戻りません)?私は推測するものはアーカイブに含まれている場合、それは、サブディレクトリを削除しているだろう(しかし、私はそれをテストしていません)。
アルジャン

@アラヤン、私はこれとc'は何の関係もないと思います。'remove-files'意図的にディレクトリを削除しません。
ニック

ああ、私はそのmanページからの「ファイルをアーカイブに追加した後、ファイルを削除する」という短い説明はあまり明確ではないと思いますが、あなたは正しいと思います。それでも、ディレクトリを削除したとして-c 上記のディレクトリが削除されるとは思わないでしょうtar。(私にとっては、それは現在のディレクトリを削除するようなものであり、使用しない場合はアーカイブ自体も含み-cますか?)しかし、-remove-files常にディレクトリをそのままにしておくと、間違いなくここで物事が複雑になります。;-)
アルジャン

3
--remove-filesバグはで修正されましたtar-1.19
x-yuri

19

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

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

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


9
ただし、rmを実行する前にtarの終了ステータスを確認する必要があります。そうでない場合、あなたは...ないtarアーカイブなしのファイルが残るかもしれない
キム・

1
1レベルのディレクトリを使用する場合、空のディレクトリを削除するだけなので、「rm」ではなく「rmdir」を使用する方が安全だと思います。[質問の編集を参照]
ニコラス

ただしrmdir空のディレクトリのみを削除します。アイデアは、ディレクトリその中のファイルを削除することでした(tar成功した場合)
pavium

--remove-filesバグはで修正されましたtar-1.19
x-yuri

&&は、前のコマンドが0(成功)で終了した場合にのみ、次のコマンドを実行します。終了する> 0の場合、次のコマンドは実行されません。||でそれを逆にすることもできます -最初のコマンドが失敗した場合にのみ実行します。ひどいコンテンツをチェックする良い方法は、それを再起動します。
Kirrus

6

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

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

1
この問題が提起されてから、tarの動作が変更された可能性が高くなります。私にとっては、置く--remove-files前後に違いはありませんmy_directory。どちらの場合も、ディレクトリは削除されます。
レッドバーン

5
--remove-filesバグはで修正されましたtar-1.19
x-yuri

1
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

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

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

しかし、いくつかのディストリビューションの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

#ツリーを見ることができるようになりました:

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                                                                                                           
著作権©2009 Free Software Foundation、Inc.

マシンで表示したい場合は、ご自身の責任でこれをコンソールに貼り付けてください。

tar-バージョン                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> tree1 / sub1 / file1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.