![프롬프트 없이 디렉토리에서 쓰기 가능한 파일만 삭제하려면 어떻게 해야 합니까?](https://linux55.com/image/85339/%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8%20%EC%97%86%EC%9D%B4%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%EC%84%9C%20%EC%93%B0%EA%B8%B0%20%EA%B0%80%EB%8A%A5%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EB%A7%8C%20%EC%82%AD%EC%A0%9C%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
디렉토리에서 쓰기 가능한 파일만 삭제하고 싶습니다. 만약 내가한다면
rm *
쓰기 가능한 모든 파일을 삭제하지만(지금까지는 괜찮았음) 쓰기 불가능한 모든 파일에 대해 프롬프트가 표시됩니다. 프롬프트가 필요하지 않으며 쓰기 불가능한 파일을 유지하고 싶습니다.
쓰기 불가능한 파일을 삭제하므로 대답은 "rm -f"가 아닙니다.
그렇다면 삭제하는 간단한 명령이 있습니까?오직쓰기 가능한 파일인데 메시지가 표시되지 않습니까?
답변1
나는 rm
이것이 개별적으로 수행되지 않는다고 생각하며 옵션에 명확한 표시가 없습니다.
find
및 를 혼합하여 rm
달성 할 수 있습니다.
find -maxdepth 1 -type f -writable -exec rm {} +
예를 들어,
tony@trinity:~/temp$ ls -l
total 0
tony@trinity:~/temp$ touch bob
tony@trinity:~/temp$ touch bill
tony@trinity:~/temp$ touch fred
tony@trinity:~/temp$ chmod 400 fred
tony@trinity:~/temp$ ls -l
total 0
-rw-r--r-- 1 tony tony 0 Mar 10 20:19 bill
-rw-r--r-- 1 tony tony 0 Mar 10 20:19 bob
-r-------- 1 tony tony 0 Mar 10 20:19 fred
tony@trinity:~/temp$ mkdir test
tony@trinity:~/temp$ cd test
tony@trinity:~/temp/test$ touch chris
tony@trinity:~/temp/test$ cd ..
tony@trinity:~/temp$ ls -lR
.:
total 4
-rw-r--r-- 1 tony tony 0 Mar 10 20:19 bill
-rw-r--r-- 1 tony tony 0 Mar 10 20:19 bob
-r-------- 1 tony tony 0 Mar 10 20:19 fred
drwxr-xr-x 2 tony tony 4096 Mar 10 20:19 test
./test:
total 0
-rw-r--r-- 1 tony tony 0 Mar 10 20:19 chris
tony@trinity:~/temp$ find -maxdepth 1 -type f -writable -exec rm {} +
tony@trinity:~/temp$ ls -lR
.:
total 4
-r-------- 1 tony tony 0 Mar 10 20:19 fred
drwxr-xr-x 2 tony tony 4096 Mar 10 20:19 test
./test:
total 0
-rw-r--r-- 1 tony tony 0 Mar 10 20:19 chris
이는 동일하게 작동하지 않으므로 rm -r
하위 디렉터리로 드롭다운하려면 이를 다시 고려해야 하며 작성된 대로 디렉터리가 전혀 삭제되지 않습니다.
~처럼@자일스예를 들어, -delete
의 모든 작업을 완료하려면 이 작업을 사용하는 것이 좋습니다 .find
$ ls -lR
.:
total 4
-rw-r--r-- 1 tony tony 0 Mar 10 23:16 bill
-rw-r--r-- 1 tony tony 0 Mar 10 23:16 bob
-r-------- 1 tony tony 0 Mar 10 20:19 fred
drwxr-xr-x 2 tony tony 4096 Mar 10 20:19 test
./test:
total 0
-rw-r--r-- 1 tony tony 0 Mar 10 20:19 chris
tony@trinity:~/temp$ find -maxdepth 1 -type f -writable -delete
tony@trinity:~/temp$ ls -lR
.:
total 4
-r-------- 1 tony tony 0 Mar 10 20:19 fred
drwxr-xr-x 2 tony tony 4096 Mar 10 20:19 test
./test:
total 0
-rw-r--r-- 1 tony tony 0 Mar 10 20:19 chris
답변2
for f in *; do [ ! -w "$f" ] || rm -- "$f"; done
또는 &&
대신 사용하십시오 ||
:
[ -w "$f" ] && rm -- "$f"
(나는 ||
그것을 set -e
많이 사용하기 때문에 선호하며, 성공하지 못한 &&
절은 해당 모드에서 종료를 유발합니다)
답변3
그리고 zsh
:
rm -- *(@,^/e:'[ -w $REPLY ]':)
즉, 쓰기 권한이 있는 심볼릭 링크와 디렉터리가 아닌 항목을 삭제하세요( rm
어쨌든 삭제되지 않으므로 제외하는 것이 좋습니다). w
glob 한정자는 파일 소유자(귀하가 아닐 수도 있음)가 쓰기 가능한지 여부만 확인하므로 여기서는 사용할 수 없습니다 .