폴더의 마지막 두 파일을 제외한 모든 파일을 삭제하는 스크립트를 작성했습니다.
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
이 스크립트는 매일 크론 작업으로 실행됩니다.
추론은 다음과 같습니다.
사용하여 모든 파일 목록을 얻습니다
ls -1
(한 줄에 하나의 파일을 얻습니다).head -n -2
;를 사용하여 목록에서 마지막 두 개를 제거하십시오 .ls
상대 경로를 인쇄 하므로xargs printf
폴더 경로를 앞에 붙여서 절대 경로로 만드십시오.를
sudo rm -rf
사용하여 보내십시오xargs
.
누구나이 폴더에 액세스 할 수 있으므로 누구나이 폴더에서 파일을 작성하고 삭제할 수 있습니다.
문제는 : sudo rm -rf
무섭다. xargs sudo rm -rf
엄청 무섭다.
실수로 또는 의도적으로 삭제 될 영리한 파일을 만들어 다른 폴더 / 시스템을 손상시킬 수있는 사람이 아무도 없도록하려고합니다. 잘 모르겠습니다.
file with / spaces.txt
그것은 매우 무서운 결과를 초래할 수 있습니다 sudo rm -rf /
.
편집 : 내 실수, 파일 이름에 포함 할 수 없으므로이 /
특정 문제는 발생하지 않지만 다른 위험이 있는지 여부에 대한 질문은 여전히 존재합니다.
이것이 내가 사용하는 이유 --quoting-style=shell-always
입니다. 공백이있는 파일의 트릭을 방지해야합니다. 그러나 이제 누군가 파일 이름에 공백 과 따옴표가있는 영리한 사람이 있는지 궁금합니다 .
내 스크립트는 안전합니까?
참고 :을 sudo
사용하여 매핑 된 네트워크 드라이브에서 원격으로 폴더를 액세스하고 있기 때문에 mount
sudo 없이는 폴더를 사용할 수 없기 때문에 필요 합니다 .
/
이름을 내가 여기 다시를 달성하기 위해 노력하고 생성
ls
출력을 구문 분석하기 때문에 인용으로도 이미 잘못 작성된 명령입니다. ls
또한 사용 순서를 정렬 로케일, 난의 목적을 무엇을 볼 수 없습니다, 그래서 생각 head
지난 2 (당신이 없애려고하지 않는 한 제거에 .
와 ..
있는이 IIRC 인수로 허용되지 않습니다 rm
어쨌든. 그냥 사용 find /path/to/folder -type f delete
. 그리고는 더 sudo
당신이 크론에서 실행하는 경우 - 크론은 루트 레벨에 이미
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?