디렉터리 계층 구조에 파일을 나열해야 합니다. 이를 위해 나는 다음과 같은 스크립트를 작성했습니다.
foreach file ( * )
ls ${file}/*/*/*/*/*.root > ${file}.txt
end
하지만 이를 위해서는 ${file} 디렉토리에 4개의 디렉토리가 있다는 것을 알아야 합니다. 그렇다면 얼마나 많은 하위 디렉터리가 존재하는지 알 필요가 없도록 이 스크립트를 일반화할 수 있는 방법이 있습니까?
답변1
csh
이제 거의 모든 결과는 실제로 tcsh
tsh 6.18.00(20120114) 이상을 사용하는 경우 사용할 수 있습니다 **
(확인 tcsh --version
).
ls "${file}"/**/*.root
이것은 것이다오직globstar
변수가 설정된 경우 작동합니다.
set globstar
다음의 전체 문서 tcsh(1)
:
쉘 변수는 모든 문자열(포함)과 일치하는 파일 전역 패턴을
globstar
허용하거나**
기존 하위 디렉토리를 재귀적으로 순회하도록 설정할 수 있습니다. 예를 들어 현재 디렉터리 트리의 모든 .c 파일이 나열됩니다. 단독으로 사용하면 0개 이상의 하위 디렉토리와 일치합니다(예를 들어, /usr/include 디렉토리 트리에 이름이 지정된 모든 파일을 나열하고 /usr/include 디렉토리 트리에서 로 끝나는 모든 파일과 일치하며 모든 .h와 일치합니다). 하위 디렉터리 이름이나 파일 이름 자체에 있는 파일 ). 재귀 문제를 방지하기 위해 glob 패턴은 디렉터리가 포함된 기호 링크로 내려오지 않습니다. 이 설정을 재정의하려면 (+)를 사용하세요.***
/
ls **.c
ls /usr/include/**/time.h
time.h
ls /usr/include/**time.h
time.h
ls /usr/include/**time**.h
time
**
***
답변2
사용find
주문하다.
foreach file ( * )
find ${file} -name "*.root" > ${file}.txt
end
약 20년이 지난 csh가 아닌 다른 쉘을 사용하는 것을 고려해 보십시오. zsh 또는 bash를 사용하여 대화식으로스크립트에 csh를 사용하지 마세요.