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)
但是执行这个我的终端就关闭了。我怎样才能正确地实现这一点?
您的命令有几个问题。
第一个是压缩存档无法更新。您需要先创建一个未压缩的存档,更新它,最后压缩它。
第二个是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)
请注意,我建议的命令将无法处理带有嵌入新行的文件,但这应该是不太可能发生的事件。