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'