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"와 관련하여 모든 경로를 얻으 려면 $dirsin을 사용해야 합니다 ."${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'

관련 정보