如何在没有任何提示的情况下仅删除目录中的可写文件?

如何在没有任何提示的情况下仅删除目录中的可写文件?

我只想删除目录中的可写文件。如果我做

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 限定符,因为它仅检查文件的所有者(可能不是您)是否可写。

相关内容