将多个目录从 bash 中的变量或循环数组复制到一个文件夹中?

将多个目录从 bash 中的变量或循环数组复制到一个文件夹中?

我正在尝试以 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'

相关内容