特定のファイルを見つけて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 番目の句はファイルのリストが保存され、環境文字列を埋めるまで待ちます。これが発生すると、最初のファイルが保存したいすべてのファイルが-exec
2番目のファイルによって削除され、失敗し、すべてのファイルが失われます-exec
。tar
間違いなくを使用しています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
...
私が提案するコマンドは、改行を含むファイルを処理しませんが、これは起こる可能性がほとんどありません。