プロンプトなしでディレクトリから書き込み可能なファイルのみを削除するにはどうすればよいですか?

プロンプトなしでディレクトリから書き込み可能なファイルのみを削除するにはどうすればよいですか?

ディレクトリから書き込み可能なファイルだけを削除したいです。もし私がするなら

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修飾子はファイル所有者(あなたではないかもしれません)が書き込み可能かどうかをチェックするので、ここでは使用できません。

関連情報