2

最近、特定のフォルダーのサイズを維持するための bash コマンドライン スクリプトを作成しています。一部のプログラムは、このフォルダー内のファイルを書き込み/更新することがあるため、「キャッチオール」 rm -rf は決してこのケースに適していないことに注意してください。

すべての「アクティブ」を取得できます。つまり、lsof を使用してファイルを開き、awk で出力できます。

lsof +D ./ | awk ' { print ( $NF ) } '

これにより、開いているファイルのリストが表示されますが、明らかにそれらを削除したくありません。ただし、残りは削除したいと思います。

^ オプションを使用して一部のファイルを除外するオプションが rm コマンドにあるといいのですが...

これをbashで達成する方法はありますか?

よろしくお願いします。

4

2 に答える 2

4

これは一時ファイルなしで 1 行で実行できますが、コメントとデバッグを容易にするために分割します。

# Get a sorted list of used files
lsof +D ./ | awk ' { print ( $NF ) } ' | sort | uniq > usedFiles

# Get a sorted list of existing files
find ./ | sort > existingFiles

# Find lines unique to existingFiles
comm -23 existingFiles usedFiles > removableFiles

# Delete them
rm $(< removableFiles)

これはホワイトスペースセーフではないことに注意してください。

于 2013-03-04T23:19:33.143 に答える
1

まず、あなたが持っていることを確認してくださいextglob

shopt -s extglob

次に、リストにないすべてのファイルを削除しますlsof

DONT_RM=`lsof +D \. | awk '{ print $NF; }' | tr "\\n" "|" | sed 's/\.\///g'` && rm !($DONT_RM)

上記を分解すると、改行の代わりにlsofパイプを使用して結果を結合し、ファイル名の先頭から先頭を削除します。次に、この OR リストのファイルを not extglob オプションとして rm に渡します。試してみてください、私の基本的なテストで動作します。|\n./!

于 2013-03-05T00:11:21.483 に答える