텍스트 파일을 검색하기 위해 상위 디렉터리와 하위 디렉터리를 반복할 수 있나요?

텍스트 파일을 검색하기 위해 상위 디렉터리와 하위 디렉터리를 반복할 수 있나요?
maindir/sub1/file1.txt
maindir/sub1/file2.txt

maindir/sub2/file1.txt
maindir/sub2/file2.txt

maindir/sub3/file1.txt
maindir/sub3/file2.txt

나는 이 텍스트 파일의 모든 줄을 읽으려고 노력하고 있지만 가능하다면 루프를 사용하여 상위 디렉터리에 있는 텍스트 파일을 검색하고 싶습니다. 각 파일의 절대 경로를 작성하는 대신.

업데이트: 나중에 구현하고 싶은 읽기 부분은 다음과 같습니다.

while read p 
do 
echo $p 
done < file.txt

답변1

find maindir -type f -name "*.txt"

답변2

간단한 루프를 사용하십시오.

shopt -s dotglob nullglob
shopt -s globstar

for pathname in maindir/**/*.txt; do
    [ ! -f "$pathname" ] && continue
    cat "$pathname"
done

위의 코드는 bash해당 끝 아래의 모든 경로 이름을 반복합니다. 일반 파일(또는 일반 파일에 대한 심볼릭 링크)에 해당하지 않는 이름은 건너뜁니다(이는 함께 제공되는 테스트의 결과입니다). 나머지는 한 줄씩 출력됩니다.maindir.txtcontinuecat

상단에 설정된 셸 옵션은 다음을 수행합니다.

  • dotglob: 숨겨진 이름과 일치하도록 와일드카드 모드를 활성화합니다.
  • nullglob: 일치하는 항목이 없으면 와일드카드 패턴을 완전히 제거합니다. 일반적으로 일치하지 않는 와일드카드 패턴은 확장되지 않은 형태로 유지됩니다.
  • globstar: Enabled Usage **, 다소 유사하게 작동 *하지만 /경로 이름 일치를 허용합니다. 즉, 하위 디렉터리의 "재귀적" 일치를 허용합니다.

cat "$pathname"이를 수행해야 하는 처리로 대체할 수 있습니다 "$pathname".


그리고 find:

find maindir -type f -name '*.txt' -exec cat {} +

이는 루프와 동일한 작업을 수행하지만 세 가지 약간의 차이점이 있습니다.

  1. 일반 파일에 대한 심볼릭 링크를 찾을 수 없습니다. 예를 들어 find옵션을 함께 사용하면 -L이를 포함할 수 find -L maindir ...있지만 이렇게 하면 유틸리티가 기호적으로 순회하게 된다는 점에 유의하세요.목차. 현재 경로 이름이 심볼릭 링크인 경우 findGNU 구현을 -xtype대신 사용하여 -type참조되는 항목의 유형을 테스트할 수 있습니다.
  2. cat한 번에 가능한 한 많은 파일을 호출합니다 .
  3. 루프(발견된 파일을 사전순으로 정렬)와 다른(정렬되지 않은) 순서로 데이터를 표시할 수 있습니다.

당신은 교체할 수 있습니다

-exec cat {} +

좀 더 일반적인 것으로

-exec sh -c 'for pathname do ...; done' sh {} +

필요한 처리 ...로 대체되어야 합니다 ."$pathname"

관련 정보