Was ist der einfachste Weg, um einen abschließenden Schrägstrich aus jedem Parameter im Array '$ @' zu entfernen, damit rsync
die Verzeichnisse nach Namen kopiert werden?
rsync -a --exclude='*~' "$@" "$dir"
Der Titel wurde zur Verdeutlichung geändert. Informationen zu den Kommentaren und Antworten zu mehreren nachgestellten Schrägstrichen finden Sie im Bearbeitungsverlauf.
Antworten:
Sie können die Verwendung
${parameter%word}
Expansion , die detailliert ist hier . Hier ist ein einfaches Testskript, das das Verhalten demonstriert:quelle
shopt -s extglob; echo "${@%%+(/)}"
tr -s /
mit variablem regulären Ausdruck , um wiederholte Schrägstriche zu entfernen, und entfernen Sie dann den nachfolgenden Schrägstrich. zBDIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"
Sie an einer Bash-Eingabeaufforderung und sagen Sie mir, was Sie sehenDie akzeptierte Antwort schneidet EINEN abschließenden Schrägstrich ab.
Eine Möglichkeit, mehrere nachgestellte Schrägstriche zu kürzen, ist folgende:
Welche Ausgänge:
quelle
TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
$()
Konstrukt nicht nötig . Es ist jedoch auch harmlos :) Daher ist es wahrscheinlich eine gute Praxis, doppelte Anführungszeichen zu verwenden,"$VALUE"
damit Sie nicht entscheiden müssen, wann und wann Sie die doppelten Anführungszeichen nicht verwenden möchten.echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'
funktioniert aber nicht (da die Erfassungsgruppe auch mit dem abschließenden Schrägstrich übereinstimmt, denke ich). Ich kann es mit zwei Befehlen machen:echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'
aber ich habe mich gefragt, ob es mit einem gemacht werden kann?sed 's:/*$::' < in.txt > out.txt
erledigt den Job in SekundenDas funktioniert bei mir:
${VAR%%+(/)}
Wie hier beschrieben http://wiki.bash-hackers.org/syntax/pattern
Möglicherweise muss die Shell-Option extglob festgelegt werden. Ich kann nicht sehen, dass es für mich aktiviert ist, aber es funktioniert immer noch
quelle
shopt extglob
extglob
.${VAR%/}
realpath
löst den angegebenen Pfad auf. Unter anderem werden auch nachgestellte Schrägstriche entfernt. Verwenden Sie-s
diese Option, um folgende Simlinks zu vermeidenquelle
realpath
fehl.realpath --canonicalize-missing
funktioniert absolut korrekt mit jedem nicht vorhandenen Teil des PfadesZu Ihrer Information, ich habe diese beiden Funktionen
.bash_profile
basierend auf den Antworten auf SO zu meinen hinzugefügt . Wie Chris Johnson sagte,${x%/}
entfernen alle Antworten, bei denen nur ein Schrägstrich verwendet wird, das, was sie sagen, und hoffen, dass dies nützlich ist.quelle
In zsh können Sie den
:a
Modifikator verwenden.Dies
realpath
verhält sich wie , fehlt jedoch nicht mit fehlenden Dateien / Verzeichnissen als Argument.quelle