将 tar 与 find 一起使用

tro*_*ura 2 shell bash tar shell-script

假设我们要查找某个文件,对它们使用 tar 并删除它们。我尝试使用

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

但是执行这个我的终端就关闭了。我怎样才能正确地实现这一点?

jll*_*gre 5

您的命令有几个问题。

第一个是压缩存档无法更新。您需要先创建一个未压缩的存档,更新它,最后压缩它。

第二个是tar语法不正确,第一个-exec子句应该使用+终止符或\;一个,但不能同时使用。

第三个更微妙,如果保留+终止符-exec就会发生,第二个子句将按顺序为每个文件执行,而第一个子句将等待保存的文件列表以填充要启动的环境字符串。发生这种情况时,第一个要存储的所有文件-exec都已被第二个删除,-exec因此tar将失败,您将丢失所有文件。

毫无疑问,您正在使用GNU tar,这里有一个简单的方法来实现您想要的:

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

GNU tar 被记录为仅在保存文件后删除文件:

$ man gtar
...
       --remove-files
              remove files after adding them to the archive
...
Run Code Online (Sandbox Code Playgroud)

请注意,我建议的命令将无法处理带有嵌入新行的文件,但这应该是不太可能发生的事件。

  • @schily 看起来你来这里只是为了自我宣传你的软件和拖钓其他答案,所以我不会再喂你了。 (2认同)