하위 디렉토리에서 확장자를 가진 모든 파일을 재귀적으로 grep하고 싶지만 csv
크기가 4M 미만인 파일만 선택합니다. 이것이 옳은 일입니까?
find . -type f -size -4M | grep --include \*.csv 'pattern'
이 명령은 .csv
기본적으로 4M보다 작은 크기에 대한 제한 없이 모든 파일을 선택하지만 find
개별적으로는 4M보다 작은 모든 파일을 올바르게 찾습니다.
답변1
먼저 가짜 데이터를 설정하겠습니다.
$ for fileno in {1..4}; do for line in {1..100000}; do printf "%d,%d,%d,%d,%d,%d,%d,%d\n" $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM; done > ~/tmp/big-fake-${fileno}.csv; done
$ for fileno in {1..4}; do for line in {1..50000}; do printf "%d,%d,%d,%d,%d,%d,%d,%d\n" $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM; done > ~/tmp/small-fake-$fileno.csv; done
관심 있는 속성이 있는지 확인해 보겠습니다.
$ du -b tmp/*.csv
4528666 tmp/big-fake-1.csv
4529227 tmp/big-fake-2.csv
4529173 tmp/big-fake-3.csv
4528782 tmp/big-fake-4.csv
2263714 tmp/small-fake-1.csv
2264028 tmp/small-fake-2.csv
2264398 tmp/small-fake-3.csv
2265134 tmp/small-fake-4.csv
이제 더 작은 파일에서 몇 가지 패턴을 찾아보겠습니다.
$ find tmp/ -type f -iregex ".*\.csv" -size -4M -exec grep '1,1,1' {} +
tmp/small-fake-3.csv:15361,2526,13438,1083,3224,13221,1,19248
물론 grep
여기서는 다른 플래그도 가능합니다. 예를 들어 -l
원하는 패턴이 포함된 파일 이름에만 관심이 있는 경우입니다.
이것을 " 괄호 대신 {} +
찾은 파일 이름 목록 삽입"에 대한 템플릿으로 생각할 수 있습니다 . find
Grep은 한 번에 하나씩 파일 이름 목록을 가져오는 것을 선호하므로 -exec grep '1,1,1' {} \;
한 번에 각 개별 파일에 대해 새 Grep 인스턴스를 시작하는 것보다 더 좋습니다.
내 생각 에 이 로고는 다른 유형의 로고 -exec
와 마찬가지로 GNU-ism이라고 생각합니다. (누군가 이에 대해 자세히 설명하는 댓글을 게시할 것이라고 확신합니다.)find
find -print0 | xargs -0