100を超えるディレクトリをターゲットにコピーを実行しようとしています。スクリプト全体を1つのファイルに含める必要があるため、ディレクトリを別のファイルに保存することはできません。後でこのスクリプトを編集し、追加のディレクトリを簡単に追加できることを願っています。一部のディレクトリにはスペースがあります。
#!/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'