[bash] 파일 경로에서 파일 디렉토리 경로 가져 오기

Bash에서 if VAR="/home/me/mydir/file.c"는 어떻게 얻 "/home/me/mydir"습니까?



답변

dirnamebasename경로 구성 요소를 추출하기 위해 찾고있는 도구는 다음 과 같습니다.

$ VAR=/home/me/mydir/file.c

$ DIR=$(dirname "${VAR}")

$ echo "${DIR}"
/home/me/mydir

$ basename "${VAR}"
file.c

그들은하지 않은 내부 배쉬 명령을하지만 그들은 POSIX 표준의있는 거 부분 (참조 dirname, basename배쉬를 실행할 시스템의 대부분에 사용할 수 있어야하므로)합니다.


답변

$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir

$ echo "${VAR##*/}"
file.c

와 의존성을 피하기 위해 basenamedirname


답변

관련 메모에서 파일 이름이나 상대 경로 만있는 경우 dirname자체적으로 도움이되지 않습니다. 나를 위해, 대답은 끝났다 readlink.

fname='txtfile'
echo $(dirname "$fname")                # output: .
echo $(readlink -f "$fname")            # output: /home/me/work/txtfile

그런 다음 둘을 결합하여 디렉토리 만 얻을 수 있습니다.

echo $(dirname $(readlink -f "$fname")) # output: /home/me/work


답변

대상 파일이 기호 링크가되도록하려면 먼저 파일을 확인하고 원본 파일을 얻을 수 있습니다. 아래 if 절이 도움이 될 수 있습니다.

if [ -h $file ]
then
 base=$(dirname $(readlink $file))
else
 base=$(dirname $file)
fi


답변

나는 이것을 가지고 놀고 대안을 생각해 냈습니다.

$ VAR=/home/me/mydir/file.c

$ DIR=`echo $VAR |xargs dirname`

$ echo $DIR
/home/me/mydir

내가 좋아하는 부분은 트리 백업을 쉽게 확장 할 수 있다는 것입니다.

$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`

$ echo $DIR
/home


답변

다음은 재귀 트리밍에 사용한 스크립트입니다. 물론 $ 1을 원하는 디렉토리로 바꾸십시오.

BASEDIR="$1"
IFS=$'\n'
cd $BASEDIR
 for f in $(find . -type f -name ' *')
 do
    DIR=$(dirname "$f")
    DIR=${DIR:1}
    cd $BASEDIR$DIR
    rename 's/^ *//' *
 done


답변

먼저 /빈 공간 ( )으로 교체 했습니다 . 그런 다음 빈 공간 앞에 모든 문자를 삭제했습니다 ( ). 마지막으로 빈 공간 인 첫 번째 문자 ( ) 를 제거했습니다 .

$ VAR="/home/me/mydir/file.c"

$ echo $VAR | tr '/' ' ' | sed 's/^.* / /' | cut -c2-
file.c