for 루프를 사용하여 디렉터리의 모든 항목을 삭제합니다.

for 루프를 사용하여 디렉터리의 모든 항목을 삭제합니다.

다음 명령을 사용하여 내 서버에서 대량의 메일을 삭제하려고 합니다. (주로 메일이 전송되지 않습니다.)

 rm -rf /home/*/mail/new/*

나는 점점-bash: /usr/bin/rm: Argument list too long

찾기를 사용해 보았습니다.

find /home/*/mail/new/ -mindepth 1 -delete

하지만 20분이 지나도 아무 일도 일어나지 않는 것 같습니다.

for 루프를 사용하여 그 안에 있는 모든 것(디렉터리, 파일, 도트 파일)을 삭제하는 방법/home/*/mail/new/

이 같은

for f in /home/*/mail/new/*.*~; do
        # if it is a file, delete it
    if [  -f $f ]
    then
        rm "$f"
    fi
done

파일과 폴더 및 그 안의 모든 내용을 삭제하려면 이 명령을 다시 작성하도록 도와주세요./home/*/mail/new/

편집: 내 질문은 FOR 루프 내에서 이 작업을 수행한다는 점에서 독특합니다.

답변1

문제는 /home/*/mail/new/*너무 많은 파일 이름으로 확장된다는 것입니다. 가장 간단한 해결책은 디렉터리를 삭제하는 것입니다.

rm -rf /home/*/mail/new/

또는 find명령을 사용하십시오. 가능해야 하지만 속도가 느려집니다.

또는 디렉토리가 필요한 경우 new루프를 사용하여 해당 디렉토리를 찾고 삭제하고 다시 생성하십시오.

for d in /home/*/mail/new/; do
    rm -rf "$d" && mkdir "$d"
done

작성하려는 루프(하지만 사용하지 마십시오. 매우 느리고 비효율적입니다)는 다음과 같습니다.

for f in /home/*/mail/new/* /home/*/mail/new/.*; do
    rm -rf "$f"
done

모든 것을 삭제하려면 파일을 테스트할 필요가 없습니다. rm -rf동일한 명령을 사용하여 디렉터리와 파일을 모두 삭제하면 됩니다. 삭제할 수 없다고 불평 .하지만 ..무시할 수 있습니다. 또는 매우 깨끗하고 오류를 방지하려면 bash에서 다음을 수행할 수 있습니다.

shopt -s dotglob
for f in /home/*/mail/new/*; do
        rm -rf "$f"
done

관련 정보