Automator 动作 shell 脚本到 tar 多个 files/folders (包含空格)
Automator action shell script to tar multiple files/folders (containing spaces)
我正在尝试创建一个 shell 脚本(用于 Automator 操作),它创建一个 .tar
多个文件的存档,其中一些 包含空格作为一部分路径或文件名。我已经阅读了许多关于 tar 创建的问题,但无法拼凑出一个工作版本。
我的理解是,它应该是这样的:
tar -cf ~/Desktop/archive.tar "/path/somefile.txt" "/path2/some folder" "/path3/some other folder"
我有两份看起来很有前途的草稿。我猜,两者都可以。
从 OS X Finder 中,文件作为参数传递给 shell 脚本或传递给 stdin
.
尝试 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" ...
我正在尝试创建一个 shell 脚本(用于 Automator 操作),它创建一个 .tar
多个文件的存档,其中一些 包含空格作为一部分路径或文件名。我已经阅读了许多关于 tar 创建的问题,但无法拼凑出一个工作版本。
我的理解是,它应该是这样的:
tar -cf ~/Desktop/archive.tar "/path/somefile.txt" "/path2/some folder" "/path3/some other folder"
我有两份看起来很有前途的草稿。我猜,两者都可以。
从 OS X Finder 中,文件作为参数传递给 shell 脚本或传递给 stdin
.
尝试 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" ...