tarをfindで使用する

tarをfindで使用する

特定のファイルを見つけてtarして削除するとしましょう。使ってみよう

touch "mycompress.bz2.tar"
find . \( -name "*.c" -o -name "*.sh*" \) -exec tar ujf "mycompress.bz2.tar" {} "+" \; -exec rm {} \;

しかし、これを実行すると端末が閉じます。これをどのように正しく実装できますか?

ベストアンサー1

コマンドにはいくつかの問題があります。

1つ目は、圧縮されたアーカイブを更新できないことです。まず、圧縮されていないアーカイブを作成して更新し、最後に圧縮する必要があります。

2番目の句はtar文法的に正しくありません。最初のセクションでは、ターミネーターまたはターミネーターのいずれかを-exec使用する必要がありますが、どちらも使用できません。+\;

3番目の節はもう少し微妙です。+終結者が保存されたらどうなりますか? 2 番目の-exec句は各ファイルに対して順次実行されますが、1 番目の句はファイルのリストが保存され、環境文字列を埋めるまで待ちます。これが発生すると、最初のファイルが保存したいすべてのファイルが-exec2番目のファイルによって削除され、失敗し、すべてのファイルが失われます-exectar

間違いなくを使用していますGNU tar。欲しいものを達成する簡単な方法は次のとおりです。

tar --files-from <(find . \( -name "*.c" -o -name "*.sh*" \)) \
    --remove-files -cjf mycompress.bz2.tar

GNU tarは、ファイルを保存した後にのみファイルを削除するように文書化されています。

$ man gtar
...
       --remove-files
              remove files after adding them to the archive
...

私が提案するコマンドは、改行を含むファイルを処理しませんが、これは起こる可能性がほとんどありません。

おすすめ記事