我正在尝试以 100 多个目录为目标来执行复制。整个脚本需要包含在一个文件中;因此,我无法将目录保存在单独的文件中。我希望将来能够编辑此脚本并轻松添加其他目录。有些目录中有空格。
#!/bin/bash
dirs=(
/dir/subdir1/anotherdir/*/.log
~/dir/subdir/file.t
/dir2/subdir2/anotherdir/*/.db
/dir2/some dir here/another/here*.*
...
...
)
dest=( my@destination)
rsync -args "$dirs" $dest
我尝试过使用"${dirs[@]}"
,但我认为我可能使用不正确,因为我无法取得任何成功的结果。
答案1
如果您使用的文件夹或文件名之间有空格的路径,则应使用反斜杠\
来指定空格。您还可以仅在包含空格的文件名中使用'dir space'
或。"dir space"
关于您的$dirs
变量,您必须使用 in"${dirs[@]}"
来"$dirs"
获取所有路径。
使用反向间隙的解决方案:
#!/bin/bash
dirs=(
/dir/subdir1/anotherdir/*/.log
~/dir/subdir/file.t
/dir2/subdir2/anotherdir/*/.db
/dir2/some\ dir\ here/another/here*.*
...
...
)
dest=("user@hostname:destination")
rsync -args "${dirs[@]}" "${dest[@]}"
#"${dest[@]}" is useful here because dest var has one item.
#or you can use ${dest[someindex]}:
rsync -args "${dirs[@]}" "${dest[0]}"
使用双引号或单引号的解决方案:
#!/bin/bash
dirs=(
/dir/subdir1/anotherdir/*/.log
~/dir/subdir/file.t
/dir2/subdir2/anotherdir/*/.db
/dir2/"some dir here"/another/here*.*
/dir2/'some dir here'/another/here*.*
...
...
)
dest=("user@hostname:destination")
rsync -args "${dirs[@]}" "${dest[@]}"
#"${dest[@]}" is useful here because dest var has one item.
#or you can use ${dest[someindex]}:
rsync -args "${dirs[@]}" "${dest[0]}"
笔记:您实际上不必使用数组来分配目的地,您可以简单地使用:dest='my@destination'
答案2
您需要引用包含空格的字符串。这里稍微复杂一些,因为您不能引用通配符。
所以,
dirs=(
/dir/subdir1/anotherdir/*/.log
~/dir/subdir/file.t
/dir2/subdir2/anotherdir/*/.db
'/dir2/some dir here/another'/here*.*
)
因为这是一个数组,所以您可以使用"${dirs[@]}"
(双引号是必需的)引用它的所有组件。
这同样适用,$dest
因为您已经为其分配了一个数组。但你最好将其保留为标量,dest='/some/path'