경로에 공백이 있는 하위 디렉터리를 해결하는 방법은 무엇입니까? [복사]

경로에 공백이 있는 하위 디렉터리를 해결하는 방법은 무엇입니까? [복사]

매핑된 드라이브의 디렉터리에 있는 파일 집합을 구문 분석하려고 합니다. 그러나 하위 디렉터리 경로의 공백으로 인해 발생하는 것으로 보이는 문제를 해결할 수 없는 것 같습니다. 어떤 도움이라도 대단히 감사하겠습니다! 감사해요.

#!/bin/bash
FILES=/home/user/.gvfs/analysis\$\ on\ server.university.edu/users/username/m/BED_files/*
#FILES=/home/user/Desktop #this works

for f in "${FILES}"
do
    echo $f
done

답변1

따옴표도 사용하는 경우 와일드카드를 변수의 일부로 사용할 수 없습니다. @jasonwryan이 제안한 배열 변수 구문에서는 루프가 실행될 때가 아니라 배열이 초기화될 때 디렉터리의 내용을 확인합니다.

#!/bin/sh
DIR='/home/user/.gvfs/analysis$ on server.university.edu/users/username/m/BED_files'

for f in "$DIR"/*
do
    echo "$f"
done

변수에 와일드카드를 정의해야 하는 경우 별도의 변수에 넣으세요.

#!/bin/sh
DIR='/home/user/.gvfs/analysis$ on server.university.edu/users/username/m/BED_files'
FILES='*.txt'

for f in "$DIR"/$FILES
do
    echo "$f"
done

답변2

최종 하위 디렉터리까지 권한이 있는지 확인하면 @jasonwryan의 답변이 작동합니다.

답변3

기본 POSIX 셸에서 배열 확장 결과를 사용하려면 $IFS파일 이름 생성에 주의해야 합니다. 따옴표 없이 변수를 안전하게 사용할 수 있지만 이는 일반적으로 가장 쉬운 방법은 아닙니다.

Shell은 무엇보다도 함께 작동하도록 설계되었습니다.논쟁- 따라서 매개변수 배열을 사용하는 것이 좋습니다.

set -- "${FILES%/*}"/*

그러나 glob의 결과를 확인해야 합니다. POSIX 셸에서 glob을 구문 분석할 수 없는 경우에도 여전히 반복 가능한 인수로 유지됩니다. 이것도 for var in glob*마찬가지입니다. 결과를 테스트하지 않으면 실제로 파일을 사용하고 있는지 확신할 수 없습니다. 그래서...

for f do [ -e "$f" ] || [ -L "$f" ] && printf %s\\n "$f"; done

다음과 같이 arg 배열의 항목을 반복할 수 있습니다 for arg do ...;done. 루프 내에서 "$1" "$2" 등으로 주소를 지정하거나 "$@"및 중 하나를 사용하여 전체적으로 주소를 지정할 수도 있습니다 "$*". 루프가 완료되면 배열은 설정된 상태로 유지됩니다.

마지막으로 주목해야 할 점은 앞서 언급했듯이 파일 이름 생성은 셸의 구성 가능한 기능이라는 것입니다. 를 사용하여 비활성화 set -f하거나 를 사용하여 활성화 할 수 있습니다 set +f. 게다가 검색 중인 디렉터리에 일치하는 파일 이름이 있는 경우에만 작동합니다. 그렇지 않은 경우 해결되지 않은 glob을 다시 가져옵니다. 전역 일치에는 디렉터리에 대한 검색 및 실행 권한도 필요합니다. 따라서 전역 일치 항목을 확인할 수 없는 경우 파일 이름 생성을 활성화하고 경로 권한을 확인하고 파일이 먼저 있는지 확인할 수 있습니다.

관련 정보