디렉토리에서 쓰기 가능한 파일만 삭제하고 싶습니다. 만약 내가한다면
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 한정자는 파일 소유자(귀하가 아닐 수도 있음)가 쓰기 가능한지 여부만 확인하므로 여기서는 사용할 수 없습니다 .