목록 파일의 디렉터리가 특정 디렉터리의 하위 디렉터리인지 확인하세요.

목록 파일의 디렉터리가 특정 디렉터리의 하위 디렉터리인지 확인하세요.

나는 이미 이 질문에 대한 답을 알고 있다고 생각하며 대답은 "작업을 수행"하는 것입니다(즉, 파일의 개별 항목을 반복하는 것). 그러나 Bash 마법을 가진 사람이 있는지 확인하고 싶었습니다.

상태:

디렉토리가 있다고 가정해 보겠습니다./mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/

디렉터리 목록이 포함된 파일이 있습니다.

/mnt/Transfer/Downloads/Documents/ProjectProposal/ 
/mnt/Transfer/Downloads/Documents/ProjectDesign/ 
/mnt/Transfer/Downloads/Documents/Thesis/Drafts/ 
...

질문:

단순히 파일을 반복하지 않고도 목록 파일의 디렉터리가 첫 번째 디렉터리의 하위 디렉터리인지 확인하는 Bash 스크립트(어쩌면 한 줄이라도?)에 빠르고 쉬운 방법이 있습니까? 즉, 목록 파일의 디렉터리가 일부 디렉터리의 하위 디렉터리인지 확인하세요.

추가 설명을 위해 편집되었습니다.가 있는 경우 해당 목록 파일(예:)에 해당 항목이 포함된 하위 디렉터리가 있는지 /foo/mnt/Transfer/Downloads/Documents/ProjectProposal/알고 싶습니다 . /foo/mnt/Transfer/Downloads/문자열 일치이면 충분합니다. 디렉터리가 실제로 존재하는지 확인할 필요가 없습니다.

비슷한 것을 구현했지만 grep -q $FILEDIRECTORY $accessLog이는 목록 파일 항목을 기반으로 별도의 디렉터리를 grep하는 더 간단한 경우입니다. 이제 나는 반대 방향으로 가고 기본적으로 단일 디렉토리 목록 파일에서 단일 전체를 "grep"하고 싶습니다.

루프를 수행해야 한다면 그렇게 할 것입니다. "더 나은 방법"이 있는지 알아보는 데 관심이 있을 뿐입니다.

미리 감사드립니다!

답변1

사용의 단점 grep은 패턴 일치를 문자열의 시작 부분에 묶을 수 있도록 정규식을 허용해야 하거나 정규식을 비활성화하고 모든 패턴 및 대상 일치가 공통적이고 반복되지 않기를 바라는 것입니다. 접두사.

정규식의 문제점은 이와 같은 패턴이 ^/mnt/one.two/string 과 일치한다는 것입니다 /mnt/one/two/. 문자열이 /mnt/one/two/일치할 수 있는 문제가 해결되었습니다 /one/two/.

또 다른 접근 방식은 awk대상 디렉터리 경로를 각 줄과 차례로 비교하여 대상의 시작과 패턴 줄의 시작이 일치하는지 확인하는 것입니다. 귀하의 디렉토리 목록이 다음 위치에 있다고 가정합니다 file.

dir="/mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/"
awk -v dir="$dir" '$0 == substr(dir, 1, length($0))' file

귀하의 예의 결과는 다음과 같습니다

/mnt/Transfer/Downloads/Documents/Thesis/Drafts/

답변2

언제

$ dir="/mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/"
$ cat file
/mnt/Transfer/Downloads/Documents/ProjectProposal/
/mnt/Transfer/Downloads/Documents/ProjectDesign/
/mnt/Transfer/Downloads/Documents/Thesis/Drafts/
...

글쎄, 일치하는 항목이 있는지 여부에만 관심이 있고 파일의 어떤 줄이 일치하는지 관심이 없다면 다음을 수행하십시오.

if echo "$dir" | grep -q -f file; then
  echo "a match exists in the file"
else
  echo "no match"
fi

답변3

perl와 함께rindex:

dir=/mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/
perl -lsne 'print if rindex($dir, $_, 0) == 0' -- -dir="$dir" < file

관련 정보