'$ @'배열의 각 매개 변수에서 후행 슬래시를 제거하여 rsync
이름별로 디렉토리 를 복사 하는 가장 간단한 방법은 무엇입니까 ?
rsync -a --exclude='*~' "$@" "$dir"
설명을 위해 제목이 변경되었습니다. 여러 후행 슬래시에 대한 설명과 답변을 이해하려면 편집 내역을 참조하십시오.
답변:
여기${parameter%word}
에 자세히 설명 된 확장을 사용할 수 있습니다 . 다음은 동작을 보여주는 간단한 테스트 스크립트입니다.
#!/bin/bash
# Call this as:
# ./test.sh one/ two/ three/
#
# Output:
# one two three
echo ${@%/}
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 "${@%%+(/)}"
그리고 당신이 무엇을보고 말해
허용되는 대답은 후행 슬래시 하나를 자릅니다.
여러 후행 슬래시를 자르는 한 가지 방법은 다음과 같습니다.
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|'
작동하지 않습니다 (캡처 그룹이 후행 슬래시와 일치하기 때문에). 두 가지 명령 echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'
으로 수행 할 수 있습니다 . 그러나 하나로 수행 할 수 있는지 궁금하십니까?
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
파일 / 디렉토리가 누락 된 것처럼 작동 하지만 실패하지 않습니다.