디렉토리에 많은 수의 파일이 있는 문제가 있습니다.
파일 시스템은 ext4입니다.
2**32 파일 제한에 도달했고 이 파티션에 파일을 쓸 수도 없습니다.
문제는 엄청납니다.
일부 파일을 다른 리소스로 이동하는 방법을 모르겠습니다.
고전적인 "ls"와 "mv"는 작동하지 않습니다. 파일이 너무 많아요...
Bash에서 파일을 빠르게 출력할 수 있는 방법이 있습니까?
디렉터리당 하나의 임의 파일(약 2**32개 파일)입니다.
파일을 빨리 다운로드할 수 있으면 스크립트를 작성할 수 있습니다.
어떤 아이디어가 있나요?
답변1
다음을 실행해 보세요.
ls --sort=none --no-group
또는 특정 수의 파일을 제한하십시오.
ls --sort=none --no-group | head -500
답변2
ls
큰 디렉터리에서 작업을 사용하는 것은 GNU가 ls
읽기 때문에 매우 비효율적입니다.모두디렉토리의 이전 항목으로 돌아가기어느--sort=none
이는 출력이 "예쁘게" 되길 원하기 때문에 사용되기도 합니다 . ext4 디렉토리에는 수백만 개의 파일이 포함될 수 있으므로 이는 느리고 RAM 집약적입니다.
find
대신, 디렉토리에서 파일 이름을 읽은 후 파일 이름을 인쇄하는 디렉토리의 파일 나열을 사용해야 합니다 . 특정 파일(예: 1MB보다 작은 모든 "*.jpg" 파일)을 찾으려면 다음을 실행할 수 있습니다.
find /my/directory -type f -name "*.jpg" -size -1M
보다(1) 매뉴얼 페이지 찾기사용 방법에 대한 자세한 내용입니다.
처리할 파일 묶음을 찾으면 xargs
각 파일에 대해 명령을 실행할 수 있습니다. 예를 들어 임시 파일을 삭제하려면 다음을 사용합니다.
find /my/directory -name "*.tmp" -type f -print0 | xargs -0 rm
또는 다음과 같은 다른 디렉토리로 이동하십시오.
find /my/directory -name "*.jpg" -print0 | xargs -0 -I '{}' mv '{}' /my/otherdirectory
아니면 여러 가지. 이 xargs
프로그램은 표준 입력에서 읽은 각 파일에 대해 특정 명령을 실행합니다.xargs(1) 매뉴얼 페이지더 알아보기. 이 명령은 대상 디렉터리를 명령 끝에 배치해야 하기 때문에 mv
조금 더 복잡합니다 . 반면 일반적으로 모든 파일은 명령이 지정된 후에 추가됩니다.rm
mv
xargs
파일 목록을 출력 파일(예: )에 저장 한 다음 삭제/이동하려는 파일만 포함하도록 find ... > /tmp/file_list
편집하고 개별적으로 다음으로 파이프할 수 있습니다.file_list
xargs
xargs -a /tmp/file_list -I '{}' mv '{}' /my/otherdir