将 tar 与 find 一起使用

将 tar 与 find 一起使用

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

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

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

答案1

您的命令存在几个问题。

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

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

第三个子句更加微妙,如果保留+终止符,则会发生第二个子句,第二个-exec子句将按顺序对每个文件执行,而第一个子句将等待文件列表保存以填充要启动的环境字符串。发生这种情况时,第一个要存储的所有文件-exec都将被第二个删除,-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
...

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

答案2

对于通常的实现之一来说tar,这是行不通的。

自 1982 年以来有一个免费的tar实现,称为star.

star2005find年基于我的libfind.

你打电话star -c -f file.out -find . \( -name "*.c" -o -name "*.sh*" \)

内置规则find很简单: 右侧的所有内容都-find遵循 的命令行规则find(1)

http://schilytools.sourceforge.net/index.html

以及明星手册页:http://schilytools.sourceforge.net/man/man1/star.1.html

有一个单独的源(请参阅网站),但最新和最好的版本目前是schilytools.

请记住,您希望在存档时删除文件的风险很高,因为您的命令可能有问题,然后您将删除无法再使用的文件。因此,我建议首先使用我的建议来归档文件,然后调用:

rm $(star -t -tpath < file.out)

这只会删除已成功放入存档中的文件。

相关内容