나는 이미 이 질문에 대한 답을 알고 있다고 생각하며 대답은 "작업을 수행"하는 것입니다(즉, 파일의 개별 항목을 반복하는 것). 그러나 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