지정된 크기보다 큰 파일이 지정된 수 이상 포함된 디렉터리의 모든 폴더를 찾는 방법은 무엇입니까?
사용 사례의 예로는 분할된 동영상 파일이 포함된 폴더를 찾는 것입니다.병합이와 같이( ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
).
답변1
그리고 zsh
:
x=42 size=M+1
print -rC1 -- **/*(NFe['()(($#)) $REPLY/*(N.L${size}Y${x}[$x]oN)'])
1MiB보다 큰 파일이 42개 이상 포함된 디렉터리가 인쇄됩니다.
**/*
: 재귀적 와일드카드(...)
: 글로벌 예선N
:N
ulglob: 일치하는 항목이 없어도 불평하지 마세요.F
: 파일 형식 제한목차모두F
(최소 하나의 항목 포함).e['code']
:필터 평가는 파일에 대해 true를e
반환합니다code
.()(($#)) args
: 인수 개수가 0이 아닌 경우 true를 반환하는 익명 함수$REPLY
: 현재 고려 중인 파일(여기서는 디렉터리)입니다code
.$REPLY/*
: 내부의 파일.$REPLY/**/*
하위 디렉터리의 파일 개수도 계산하는 것으로 대체되었습니다 ..
: 제한된정기적인파일(디렉토리, 심볼릭 링크, fifo, 장치 제외).LM+1
: 1보다 큰 파일(파일 크기 1048577바이트 이상)의 경우 제한 크기는 다음 정수 메가바이트로 반올림됩니다.Y$x
: 나 좀 그만 돌봐줘엑스이는 최적화된 것으로 확인되었습니다 .[$x]
:선택하다엑스목록에 있는 항목입니다 (다시 최적화이므로code
최소한 하나의 인수가 전달되었는지 확인하세요).oN
: 이 목록을 정렬하려고 애쓰지 마세요.
D
숨겨진 디렉터리/파일도 고려하려면 glob 중 하나 또는 둘 다에 한정자를 추가할 수 있습니다.
그러나 나중에 이러한 파일에 대해 일부 작업을 수행하려면 다음을 수행해야 할 수도 있습니다.
for dir in **/*(NF); do
large_files=($dir/*(N.LM+1))
(( $#large_files >= 42 )) && do-something-with $large_files
done