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