프롬프트 없이 디렉토리에서 쓰기 가능한 파일만 삭제하려면 어떻게 해야 합니까?

프롬프트 없이 디렉토리에서 쓰기 가능한 파일만 삭제하려면 어떻게 해야 합니까?

디렉토리에서 쓰기 가능한 파일만 삭제하고 싶습니다. 만약 내가한다면

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어쨌든 삭제되지 않으므로 제외하는 것이 좋습니다). wglob 한정자는 파일 소유자(귀하가 아닐 수도 있음)가 쓰기 가능한지 여부만 확인하므로 여기서는 사용할 수 없습니다 .

관련 정보