自动操作操作 shell 脚本以 tar 多个文件/文件夹(包含空格)



我正在尝试创建一个 shell 脚本(用于"自动操作"操作(,该脚本创建多个文件的.tar存档,其中一些文件包含空格作为路径或文件名的一部分。我已经阅读了许多关于 SO 的关于 tar 创建的问题,但无法拼凑出一个工作版本。

我的理解是,它应该是这样的:

tar -cf ~/Desktop/archive.tar "/path/somefile.txt" "/path2/some folder" "/path3/some other folder"

我有两份草案对我来说很有希望。我猜,两者都可以工作。

从OS X Finder中,文件作为参数或stdin传递给shell脚本。

尝试 1 ( /bin/bash , 传递输入 as arguments (

files=''
path=''
for f in "$@"
do
    path=`dirname "$f"`
    file=`basename "$f"`
    files=$(printf '%s -C "%s" "%s"' "$files" "$path" "$file")
done
tar -cf ~/Desktop/archive.tar "$files"

在这里,我尝试仅连接文件名并将它们传递给带有 -C 标志的tar,该标志应该更改为提供的目录。可能过于复杂了。

尝试 2 ( /bin/bash , 传递输入 to stdin (

tar -cf ~/Desktop/archive.tar -T -

这是有效的,但有一个明显的缺点:完整路径被保存到存档中(包括我的家乡目录名称(。有没有办法让它只保存basename并丢弃路径(这就是我在尝试 1 中想要的(?

如果有人可以帮助我使其工作,我愿意使用任何一种解决方案。

files 变量中嵌入引号不会达到您的预期(请参阅 BashFAQ #50(。您需要改用数组:

files=()
...
    files+=(-C "$path" "$file")
...
tar -cf ~/Desktop/archive.tar "${files[@]}"

这将执行如下操作:

tar -cf ~/Desktop/archive.tar -C "path1" "file1" -C "path2" "file2" ...

相关内容

最新更新