假设我们想要找到某个文件,对它们使用 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
.
star
2005find
年基于我的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)
这只会删除已成功放入存档中的文件。