ユーザーが3つのフォルダ名を入力したら、他の名前をすべて$ colの場所に一度だけ配置したいと思います。
rsync -RravhP $Code --exclude "pub/$col" --exclude "$col" --exclude "$col" $destination;
#!/bin/bash
echo " enter source folder name" ;
read Code ;
echo " enter destination folder name"
read destination ;
if [ $Code ] ;
then
echo " enter folders to exclude seperated by a space"
read folders ;
colors="$folders"
for col in "$colors"
do
rsync -RravhP $Code --exclude "pub/$col" --exclude "$col" --exclude "$col" $destination ;
done
else
echo " something went wrong, please check foldername "
fi
答え1
--exclude
ユーザーが入力した名前ごとにフラグも作成したいとします。つまり、ユーザーが名前を入力したら、foo bar
コマンドラインに次の内容を含めたいと思いますか?
rsync ... --exclude foo --exclude bar ...
これでマークしたから強く打つ、あなたが利用できるread -a
ユーザーが直接入力した単語を読んでください。大量に、必須パラメータを含む別の配列を構築しますrsync
。
read -a dirs
excludes=()
for d in "${dirs[@]}" ; do
excludes+=(--exclude "$d")
done
rsync -RravhP "$Code" "${excludes[@]}" "$destination"
そうでない場合でも、2つの名前の合計を取得するのと同じものを入力して、スペースで名前をエスケープ-r
できます。read
aa bb\ cc
aa
bb cc
答え2
以下では、二重引用符を削除する必要があります。
for col in "$colors"
それ以外の場合は、区切られたすべてのスペースが$colors
1つとして表示されます$col
。
colors="$folders"
この問題も発生する可能性があることに注意してください。以下をテストしてみることもできます。
for col in $folders
やっぱりそうです。内部のデータを直接読み取ることもできます$colors
。
クイックテストでは、次のことができます。
for n in "1 2 3"
do
echo $n
done
結果は次のとおりです。
1 2 3
行に。
あなたがしたいことは:
for n in 1 2 3
do
echo $n
done
2番目のケースでは、次のようになります。
1
2
3
フォルダの1つにスペースが含まれている場合は、すでに実行したループ内に引用符を使用できます。しかし、シェルスクリプトでファイル名のスペースを正しく処理することは常に非常に複雑です。動作していることを確認する最善の方法は、そのフォルダを使用してテストを実行することです。
答え3
これは私にとって効果的です。
**#!/bin/bash
echo " enter source folder name" ;
read Code ;
echo " enter destination folder name"
read destination ;
echo " input folders to exclude" ;
read folders ;
input="$folders"
echo the folders entered are $input
for cols in $input ;
do
echo $cols >> log.txt
rsync -RravhP --exclude-from log.txt $Code $destination
log.txt**