'$ @'配列の各パラメータから末尾のスラッシュを削除してrsync
、ディレクトリを名前でコピーする最も簡単な方法は何ですか?
rsync -a --exclude='*~' "$@" "$dir"
わかりやすくするためにタイトルを変更しました。複数の末尾のスラッシュに関するコメントと回答を理解するには、編集履歴を参照してください。
回答:
shopt -s extglob; echo "${@%%+(/)}"
tr -s /
可変正規表現と組み合わせて、繰り返されるスラッシュを削除してから、末尾のスラッシュを削除します。例DIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"
、表示されている内容を教えてください
受け入れられた回答は、末尾のスラッシュを1つ削除します。
複数の末尾のスラッシュをトリミングする1つの方法は、次のとおりです。
VALUE=/looks/like/a/path///
TRIMMED=$(echo $VALUE | sed 's:/*$::')
echo $VALUE $TRIMMED
どの出力:
/looks/like/a/path/// /looks/like/a/path
TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
$()
構成内では必要ありません。ただし、無害でもあります:)したがって"$VALUE"
、二重引用符を使用する場合と使用しない場合を決定する必要がないように、二重引用符を使用することをお勧めします。
echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'
機能しません(キャプチャグループも末尾のスラッシュと一致するためです)。私は2つのコマンドでそれを行うことができます:echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'
しかし、それが1つでできるかどうか疑問に思いましたか?
sed 's:/*$::' < in.txt > out.txt
は数秒で仕事をします
これは私のために働きます: ${VAR%%+(/)}
ここで説明されているようにhttp://wiki.bash-hackers.org/syntax/pattern
シェルオプションextglobを設定する必要があるかもしれません。有効になっているのがわかりませんが、それでも機能します
shopt extglob
オプションなし
extglob
。
${VAR%/}
realpath
指定されたパスを解決します。とりわけ、末尾のスラッシュも削除します。-s
simlinksのフォローを防ぐために使用します
DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
realpath
ないパスをスローすると、失敗します。
realpath --canonicalize-missing
は、パスの存在しない部分で完全に正しく機能します
zshを使用でき:a
修飾子を。
export DIRECTORY='/some//path/name//'
echo "${DIRECTORY:a}"
=> /some/path/name
これはのようにrealpath
機能しますが、引数としてファイル/ディレクトリが欠落していても失敗しません。