디렉터리의 파일 개수 계산

디렉터리의 파일 개수 계산

나는 스크립트 중 하나의 끝 부분에 다음 코드를 사용하여 내가 처리하고 해당 디렉터리로 이동한 파일 수를 집계했습니다.

# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l

내 문제는 중복 파일을 처리하는 방법에 있습니다. 지금 당장은 먼저 파일이 있는지 확인합니다(내 스크립트는 본질적으로 내가 처리 중인 소스 파일을 파괴하기 때문입니다). 해당 이름의 파일이 이미 처리된 것을 감지하면 다음과 같이 파일 이름을 변경합니다.

중복 파일: foo.pdf

변경된 이름: foo.x.pdf

foo.x.pdf가 있으면 다시 foo.xx.pdf로 이름을 바꿉니다. 필요에 따라 반복합니다. 나는 나중에 들어가서 각 '버전'을 평가하고 가장 좋은 버전을 선택하여 보관할 생각입니다. 하지만 여기에 내 문제가 있습니다. .x가 포함되지 않은 파일 수를 계산하고 싶습니다. .더블 엑스. 등등. 고유한 파일만 계산할 수 ls있도록 출력 에서 ​​이러한 항목을 어떻게 제거합니까 ?wc -l

핵심요약: 파일 이름에 특정 하위 문자열이 포함되지 않은 특정 디렉터리의 파일 수를 어떻게 알 수 있나요?

답변1

포함되지 않은 디렉토리의 파일 수를 찾으려면 .x.pdf다음을 시도하십시오.

find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c

x마침표 - 하나 이상의 마침표 - 가 포함되지 않은 디렉터리의 파일 수를 찾으려면 pdf다음을 시도하십시오.

find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

위의 검색은 하위 디렉터리를 반복적으로 검색합니다. 원하지 않으시면 옵션을 추가해주세요 -maxdepth 1. 예를 들어:

find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

를 사용하기 때문에 -printf '1'디렉토리에 이름에 개행 문자가 포함된 파일이 있더라도 이 방법은 안전합니다.

답변2

하위 디렉터리가 없는 경우:

echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))

왜냐하면:

for file in *.sh ; do echo -n 1+; done; echo 0;
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+0

답변3

ls옵션을 (한 번 이상) 사용하여 명령 에서 패턴과 일치하는 파일을 제외할 수 있습니다 -I.--ignore=PATTERN참조):

ls -I "*.x*.pdf" "${Destination}" | wc -l

또는 다음과 같은 방법으로 빼기 방법을 사용할 수 있습니다.

echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))

관련 정보