실수로 수백만 개의 파일을 디렉터리에 쓴 후(그런 다음 삭제한 후) Bash 탭 완료 속도가 느려짐

실수로 수백만 개의 파일을 디렉터리에 쓴 후(그런 다음 삭제한 후) Bash 탭 완료 속도가 느려짐

어느 날 내 홈 디렉터리에 400만 개의 작은 텍스트 파일을 쓰는 스크립트 오류가 발생했습니다.

실수로 400만 개의 작은 텍스트 파일을 폴더에 썼습니다. 삭제하는 가장 좋은 방법은 무엇입니까?

파일을 삭제했는데 그 이후로 파일 이름이나 경로를 완성하기 위해 탭을 클릭할 때마다 어떤 일이 발생하기까지 0.5초의 지연이 발생합니다.

이제 파일이 삭제되었지만 gpt 또는 유사한 파일에 지속적인 손상이 있었던 것 같습니다. 이 문제를 정리하는 데 사용할 수 있는 유용한 도구가 있나요?

파일 시스템은 ext4(RAID 1의 3TB 드라이브 2개)이고 CentOS 7을 실행하고 있습니다.

% ls -ld "$HOME"
drwx------. 8 myname myname 363606016 Nov 18 09:21 /home/myname 

감사해요

답변1

설명에서 언급했듯이 홈 디렉터리 자체는 크기 때문에 더 이상 축소되지 않습니다. 홈 디렉터리의 내용을 검색하려면 매번 (캐시나 디스크에서) 많은 양의 데이터를 읽어야 합니다.

이 문제를 해결하려면 홈 디렉터리를 다시 만들어야 합니다.

  • 로그아웃하고 루트로 로그인한 후 홈 디렉터리를 참조하는 실행 중인 프로세스가 없는지 확인하세요.

    lsof /home/myname
    
  • 홈 디렉터리를 복사합니다.

    cd /home
    cp -al myname myname.new
    
  • 홈 디렉토리 이름을 바꾸십시오.

    mv myname myname.old
    
  • 새 홈 디렉토리의 이름을 바꾸십시오.

    mv myname.new myname
    

이제 다시 로그인하실 수 있습니다. 빛나는 새 홈 디렉토리는 실제로 필요한 공간만 차지하며 파일 작업은 예상만큼 빨라야 합니다. cp -al새 디렉터리 아래의 모든 파일을 사용할 수 있는지 확인하십시오. 단, 디렉터리 구조 외에 추가 공간을 차지하지 않도록 하드 링크를 사용합니다. 하드 링크가 있기 때문에 디렉터리 중 하나에 있는 파일에 대한 모든 변경 사항은 다른 디렉터리에 반영되지만 안전하게 삭제할 수 있습니다 myname.old.

한때 많은 수의 파일이 포함된 모든 디렉터리에 비슷한 접근 방식을 사용할 수 있지만 대부분의 경우 먼저 로그아웃할 필요가 없습니다.

답변2

다른 답변에서 언급했듯이 디렉터리를 쉽게 다시 만들 수 있다면 시스템을 종료하지 않고도 이 작업을 수행할 수 있습니다.

다른 경우에는 디렉터리 트리에 있는 파일의 수나 크기로 인해 파일을 새 디렉터리에 복사하기가 더 어려워집니다. 파일 시스템을 마운트 해제하고(또는 루트 파일 시스템인 경우 복구 디스크에서 부팅) 다음을 e2fsck -fD /dev/sdX실행할 수도 있습니다. 디렉토리를 최적화할 파일 시스템( -D옵션). 이는 파일 데이터를 복사하지 않고 디렉토리 항목을 최소 블록 수로 압축합니다.

답변3

mvStephen Kitt의 답변은 기본적으로 올바른 접근 방식이지만 완료하기보다는 사용해야 합니다 cp. 파일을 이동하는 데 거의 시간이 걸리지 않으므로 모든 파일을 복사하는 데 몇 분 또는 몇 시간을 소비할 필요가 없습니다. 예를 들어:

  1. 사용자(Ssh 세션을 포함한 모든 로그인 인스턴스)로 로그아웃하고 루트로 로그인합니다.

    시스템이 직접 루트 로그인을 방지하도록 구성된 경우(예: 루트 비밀번호가 비활성화된 경우) 루트로 로그인하십시오.다른su사용자(필요한 경우 하나를 만들고 액세스 또는 권한을 부여 sudo) 루트 셸을 가져옵니다.

  2. 사용자가 프로그램을 실행하고 있지 않거나 홈 디렉터리에 파일이 열려 있는지 확인할 필요가 없습니다.파일 핸들(및 inode 번호)은 변경되지 않기 때문에홈 디렉토리에 자체 전용 파일 시스템이 없는 경우(예 /home/username: /home.

    실제 이동(아래 3단계)은 1초도 채 걸리지 않습니다(홈 디렉터리의 최상위 수준에 있는 파일 및 디렉터리 수에 따라 다름. 이것이 이동해야 하는 전부입니다). mv대신 cp- 데이터가 복사되지 않으며 이름 바꾸기를 통해 모두 빠르게 완료됩니다.

    그렇게 짧은 시간 내에 새 파일을 생성하거나 이동하지 않은 파일을 열려고 시도하는 경우는 거의 없습니다.

    그러나 편집증이 있거나가능한cron또는 업무 등에서 이 작업을 수행 at한 다음 일시적으로 비활성화할 수 있습니다. 나중에 다시 시작하는 것을 잊지 마세요.

    이 작업을 수행할 수 있는 다른 실행 중인 프로세스(예: NFS, 삼바, 메일 배달, ftpd 등)도 마찬가지입니다. 지금 해당 프로세스를 종료하고 나중에 다시 시작하세요. 그런데, 예를 들어 pkill -u username다음을 사용하여 모든 사용자 소유 프로세스를 종료할 수 있습니다.

  3. mv홈 디렉터리의 모든 내용을 새 홈 디렉터리에 복사합니다. 예를 들어 홈 디렉터리가 이면 /home/username루트로 다음 명령을 실행합니다.

    cd /home
    mv username username.old
    mkdir username
    
    # move the files and subdirectories to the new home
    # BTW, using `find` ensures that "hidden" dotfiles and dotdirs are moved
    # along with the non-hidden files & dirs.
    cd username.old
    find . -mindepth 1 -maxdepth 1 -exec mv {} ../username/ +
    cd ..
    
    # fix ownership and perms of the new home dir
    gid="$(getent passwd username | cut -d: -f4)"
    perms="$(stat --printf "%a" username.old)"
    chown "username:$gid" username
    chmod "$perms" username
    
    rmdir username.old
    

참고: stat --printf ...위의 작업에는 GNU 통계가 필요합니다. Centos 7을 실행하고 있다고 말씀하셨는데, 이것이 바로 Centos 7입니다.

GNU가 아닌 시스템에서 비슷한 문제가 발생하는 경우 권한을 복제하는 다른 방법을 찾아야 합니다. FreeBSD 버전은 stat기능은 비슷하지만 옵션이 다릅니다. 또는 새 디렉토리에 대한 권한을 수동으로 설정하십시오. 아마도 775or 755(set-gid 등을 사용하여 )일 것입니다. 그러나 2775or 또는 다른 것을 사용하여 2755확인 하십시오.ls -ldstat

관련 정보