各パラメーターから末尾のスラッシュを削除する最も簡単な方法は何ですか?


97

'$ @'配列の各パラメータから末尾のスラッシュを削除してrsync、ディレクトリを名前でコピーする最も簡単な方法は何ですか?

rsync -a --exclude='*~' "$@" "$dir"

わかりやすくするためにタイトルを変更しました。複数の末尾のスラッシュに関するコメントと回答を理解するには、編集履歴を参照してください。


回答:


160

ここ${parameter%word}で詳しく説明さている拡張を使用できます。動作を示す簡単なテストスクリプトを次に示します。

#!/bin/bash

# Call this as:
#   ./test.sh one/ two/ three/ 
#
# Output:
#  one two three

echo ${@%/}

35
+1:非常に衒学的であるために、それはすべての末尾のスラッシュではなく、単一のスラッシュを削除します。末尾のスラッシュをいくつでも削除するには:shopt -s extglob; echo "${@%%+(/)}"
glenn jackman 2012年

24
警告:すべての場合に末尾のスラッシュを削除したくない場合があります。「/」が引数として指定されている場合、末尾のスラッシュを削除すると...残念な結果になります。
ゴードン

13
ヒント:tr -s /可変正規表現と組み合わせて、繰り返されるスラッシュを削除してから、末尾のスラッシュを削除します。例DIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
デイブ

1
本当に?bashプロンプトで、実行してset -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"、表示されている内容を教えてください
glenn jackman 2015年

1
@twalbergコメントスレッドでのOPの質問に対する単なる代替回答ではない「ヒント」に感謝します。
カイルストランド

39

受け入れられた回答は、末尾のスラッシュを1つ削除します。

複数の末尾のスラッシュをトリミングする1つの方法は、次のとおりです。

VALUE=/looks/like/a/path///

TRIMMED=$(echo $VALUE | sed 's:/*$::')

echo $VALUE $TRIMMED

どの出力:

/looks/like/a/path/// /looks/like/a/path

1
彼らは空白が含まれている場合には、あなたの変数を引用することを忘れないでください: TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
鉄人

1
実際、これは$()構成内では必要ありません。ただし、無害でもあります:)したがって"$VALUE"、二重引用符を使用する場合と使用しない場合を決定する必要がないように、二重引用符を使用することをお勧めします。
クリスジョンソン

これを以前のキャプチャと組み合わせる方法はありますか?プロトコルと(存在する場合)末尾のスラッシュをURLから削除したいのですが、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は数秒で仕事をします
MitchellK

22

これは私のために働きます: ${VAR%%+(/)}

ここで説明されているようにhttp://wiki.bash-hackers.org/syntax/pattern

シェルオプションextglobを設定する必要があるかもしれません。有効になっているのがわかりませんが、それでも機能します


2
設定を照会するには:shopt extglobオプションなし
glenn jackman 2015年

これは拡張パターン言語であり、を設定する必要ありますextglob
ingyhere 2016年

1
これは、Mac OSXの組み込みbashでは機能しません。上記ショーン明るいにより溶液の処理が行われます。${VAR%/}
アレック・ヤコブソン

13

realpath指定されたパスを解決します。とりわけ、末尾のスラッシュも削除します。-ssimlinksのフォローを防ぐために使用します

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a

1
最後のノードを除いて、パス内のすべてのノードが存在する必要があります。ユーザーが存在しrealpathないパスをスローすると、失敗します。
リウィウス

2
@Livyrealpath --canonicalize-missingは、パスの存在しない部分で完全に正しく機能します
maoizm

一部のプラットフォームではrealpathがありません:
Mark Ribau

8

.bash_profile参考までに、SOで見つかった回答に基づいて、これら2つの関数を追加しました。クリスジョンソンが言ったように、使用${x%/}するすべての答えはスラッシュを1つだけ削除します。これらの関数は、彼らが言うことを実行します。これが役立つことを願っています。

rem_trailing_slash() {
    echo "$1" | sed 's/\/*$//g'
}

force_trailing_slash() {
    echo "$(rem_trailing_slash "$1")/"
}

4

zshを使用でき:a修飾子を。

export DIRECTORY='/some//path/name//'

echo "${DIRECTORY:a}"

=> /some/path/name

これはのようにrealpath機能しますが、引数としてファイル/ディレクトリが欠落していても失敗しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.