여러 하위 디렉터리에서 파일 목록을 찾고 각 파일의 경로를 txt 파일에 저장해야 합니다. 목록에 나열된 모든 파일 이름이 있습니다 filenames.txt
. 나는 이것을하려고 노력하고 있습니다 :
while read -r fname; do
find . -name "$fname" > paths.txt
done < filenames.txt
맞습니까? 검색할 하위 디렉터리(200,000개)가 많다는 것을 알고 있음에도 예상보다 시간이 많이 걸리는 것 같습니다. 더 좋은 방법이 있나요? 감사해요
답변1
filenames.txt의 각 줄에 대해 한 번씩 find를 여러 번 실행하고 있습니다. 이것이 병목 현상일 수 있습니다.
반대 과정을 시도해 볼 수도 있습니다. 먼저 모든 파일을 찾은 다음 목록에 있는 파일과 비교하세요. 그것은 마치
find * > allfiles.txt
grep -f filenames.txt allfiles.txt
답변2
다음을 수행할 수 있습니다.
find . -print0 | gawk -F/ '
ARGIND == 1 {selected[$0]; next}
$NF in selected' filenames.txt RS='\0' -
즉, find
보고서 가 있습니다.모두gawk
파일이지만 filenames.txt
.
이렇게 하면 find
한 번만 실행하고 보다 효율적인 방법으로 일치시키면 됩니다.
filenames.txt
와일드카드 패턴 목록이 아닌 리터럴 파일 이름 목록을 포함한다고 가정합니다 ( find
'에는 -name
리터럴 파일 이름이 아닌 와일드카드 패턴이 필요함).