Apache, mysql, php로 Debian Squeeze를 실행하는 컴퓨터가 있습니다. 디렉터리 중 하나에 다른 디렉터리가 있고 500,000개가 넘는 파일이 너무 많아서 WinSCP를 통해 삭제하려고 시도했지만 중단되었습니다. 24시간이 지난 후에도 WinSCP가 여전히 응답하지 않습니다. 지금은 Putty(rm -rf dirname)를 사용하여 이 디렉터리를 삭제하려고 하는데 WinSCP와 마찬가지로 응답이 없습니다. 어떤 제안이 있으십니까? 감사해요!
나는 컴퓨터에 대한 루트 액세스 권한을 가지고 있습니다.
답변1
디렉토리를 삭제하면 작동합니다. 파일이 너무 많기 때문에 개별 파일을 삭제하려고 하면 문제가 발생할 수 있습니다. 당신은 달리고 있지 않습니까 rm -rf dirname/*
?
내 생각엔 비활성으로 인해 ssh 연결이 끊어진 것 같습니다. 명령이 서버에서 올바르게 실행되지 않았습니까?
어쨌든 가능한 해결 방법은 다음을 사용하는 것입니다.안돼:
nohup rm -rf dirname
명령을 실행하고 로그오프하면 백그라운드에서 계속됩니다.
업데이트:
나는 찾았다이 질문U&L.SE에서 한 번 보시기를 권합니다. 안타깝게도 문제를 재현할 수 없습니다. 나는 2516007개의 파일로 디렉토리를 만들었고 다음을 사용하여 언제든지 삭제할 수 있습니다 rm -rf
.
$ mkdir ha
$ for X in $(seq 1 10000);do touch {1..10000}_$X; done
$ ls -f ha | wc -l
2516007 <= I stopped before the for loop finished, but this should be enough
$ time rm -rf ha/
real 23m11.695s
user 0m3.540s
sys 0m42.891s
그래서 ~2백만 개의 빈 파일을 삭제하는 데 20분이 걸렸습니다. 비어 있지 않은 엄청난 양의 파일을 삭제하는 데 몇 시간이 걸릴 수 있다는 것은 합리적으로 보입니다.
어쨌든 U&L 질문의 제안 중 일부가 도움이 될 것입니다. 특히 이것은:
find /delb -type f --delete
또는 이것(원본에서 약간 수정됨)
find /delb -type f -print0 | xargs -0r rm -f
마지막으로, 한 번에 몇 개의 파일을 삭제하는 방법도 있습니다. 일부 파일 이름은 "foo" 문자열로 시작하고 다른 파일 이름은 "bar" 등으로 시작한다는 것을 알고 있는 경우 다음을 수행하십시오.
rm -rf /delb/foo*
rm -rf /delb/bar*
등등. 다음과 같이 시도해 볼 수도 있습니다.
for n in {a..z}; do rm -rf /delb/$n*; done
for n in {A..Z}; do rm -rf /delb/$n*; done
for n in {0..9}; do rm -rf /delb/$n*; done
이 마지막 명령은 각 알파벳 문자로 시작하는 각 파일 이름을 순차적으로 삭제한 다음 숫자로 시작하는 모든 파일 이름을 삭제합니다.
답변2
이미 게시된 답변이 아닌 측면에서. inode가 부족한 파일 시스템을 처리한 경험에서 비롯됩니다. 파일 시스템에 10억 개가 넘는 파일이 있습니다.
파일을 삭제하거나 나열하는 가장 빠른 방법은 찾기를 사용하는 것입니다. 특히 수천 개의 파일/디렉토리가 있는 경우 더욱 그렇습니다. 수행할 확장이 없으면 찾기가 즉시 작동하기 시작합니다.
/path/to/be/deleted 찾기 -type f --delete
*
명령의 일부로 다른 유형의 명령줄 확장을 사용하지 마세요 . *
rm / ls 등의 명령으로 전달되기 전에 터미널에서 실행됩니다. 따라서 터미널은 작업을 수행할 실제 명령에 전달하기 전에 수십만 개의 파일을 모두 나열하려고 거기에 앉아 있습니다. 이것은 매우 느립니다.
man bash
...
확장
확장은 단어로 분할된 후 명령줄에서 수행됩니다. 수행되는 확장에는 중괄호 확장, 물결표 확장, 매개변수 및 변수 확장, 명령 대체, 산술 확장, 단어 분할, 경로명 확장 등 7가지 종류가 수행됩니다.
...