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
.txt
continue
cat
상단에 설정된 셸 옵션은 다음을 수행합니다.
dotglob
: 숨겨진 이름과 일치하도록 와일드카드 모드를 활성화합니다.nullglob
: 일치하는 항목이 없으면 와일드카드 패턴을 완전히 제거합니다. 일반적으로 일치하지 않는 와일드카드 패턴은 확장되지 않은 형태로 유지됩니다.globstar
: Enabled Usage**
, 다소 유사하게 작동*
하지만/
경로 이름 일치를 허용합니다. 즉, 하위 디렉터리의 "재귀적" 일치를 허용합니다.
cat "$pathname"
이를 수행해야 하는 처리로 대체할 수 있습니다 "$pathname"
.
그리고 find
:
find maindir -type f -name '*.txt' -exec cat {} +
이는 루프와 동일한 작업을 수행하지만 세 가지 약간의 차이점이 있습니다.
- 일반 파일에 대한 심볼릭 링크를 찾을 수 없습니다. 예를 들어
find
옵션을 함께 사용하면-L
이를 포함할 수find -L maindir ...
있지만 이렇게 하면 유틸리티가 기호적으로 순회하게 된다는 점에 유의하세요.목차. 현재 경로 이름이 심볼릭 링크인 경우find
GNU 구현을-xtype
대신 사용하여-type
참조되는 항목의 유형을 테스트할 수 있습니다. cat
한 번에 가능한 한 많은 파일을 호출합니다 .- 루프(발견된 파일을 사전순으로 정렬)와 다른(정렬되지 않은) 순서로 데이터를 표시할 수 있습니다.
당신은 교체할 수 있습니다
-exec cat {} +
좀 더 일반적인 것으로
-exec sh -c 'for pathname do ...; done' sh {} +
필요한 처리 ...
로 대체되어야 합니다 ."$pathname"