フォルダー内の最後の2つのファイルを除くすべてを削除するスクリプトを作成しました。
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
このスクリプトは、毎日cronジョブとして実行されます。
その理由は次のとおりです。
を使用してすべてのファイルのリストを取得します
ls -1
(そのため、1行に1つのファイルを取得します)。を使用してリストから最後の2つを削除し
head -n -2
ます。ls
は相対パスを出力するので、を使用しxargs printf
てフォルダーパスを先頭に追加し、絶対パスにします。それらを送る
sudo rm -rf
使用xargs
。
誰でもこのフォルダにアクセスできるため、誰でもこのフォルダ内のファイルを作成および削除できます。
問題は、 sudo rm -rf
怖いです。xargs sudo rm -rf
信じられないほど怖いです。
削除する巧妙なファイルを(誤ってまたは故意に)作成することで、他のフォルダやシステムに損傷を与えないようにしたいと思います。わからない、次のような賢いもの:
file with / spaces.txt
これは非常に怖い結果になる可能性がありsudo rm -rf /
ます。
編集:私の間違い、ファイル名にを含めることはできない/
ため、この特定の問題は発生しませんが、他のリスクがあるかどうかについての問題はまだ残っています。
これが私がを使用している理由--quoting-style=shell-always
です。これにより、スペースのあるファイルでのトリックが防止されます。しかし、私は誰かがファイル名にスペースと引用符で余分に賢いのではないかと思っています。
スクリプトは安全ですか?
注:必要なのはsudo
、(マップされたネットワークドライブからを使用してmount
)リモートでフォルダーにアクセスしているためです。sudo がないと機能しません。
/
名前に文字が含まれているファイルを作成できますか?ここでこれを達成しようとしています
ls
出力を解析しているという理由だけで、引用符を付けても、これはすでに不十分なコマンドです。ls
私はの目的何が表示されないので、また、私が思うに、順番を並べ替えるためのロケールを使用してhead
、あなたがしているのを取り除くしようとしない限り、(最後の2を除去する.
と..
IIRCの引数として許可されていないrm
とにかく。ただ、使用をfind /path/to/folder -type f delete
。そして、sudo
cronから実行する場合- いいえ、cronはすでにルートレベルにあります
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
か?