保持するファイルの量を設定する変数を使用して、ディレクトリ内の最も古いファイルを破棄するbashスクリプトを作成しようとしています。
私の最初のステップは、保持する10個の最新ファイルのセット数よりも古いファイルの数をカウントすることでした。
#!/bin/bash
# How many files in the current directory are older than the retained files
olderThanRetain=$(find -maxdepth 1 -type f | sort -r | sed -e '1,10d' | wc -l)
echo $olderThanRetain
正常に動作します。
しかし、保持するファイル数の変数を設定しようとすると:
#!/bin/bash
retain=10
# How many files in the current directory are older than the retained files
olderThanRetain=$(find -maxdepth 1 -type f | sort -r | sed -e "1,(( $retain ))d" | wc -l)
echo $olderThanRetain
しかし、これは私にエラーを与えます:
sed: -e expression #1, char 3: unexpected `,'
私は何を見逃しましたか?
bash
のコンマは特殊文字ではないため、この式を引用符で囲む必要はありません。次のように使用できます。
sed 1,${retain}d
奇妙なファイル名(改行を含むファイル名を想像してください)の問題を回避するには、0
を行区切り文字として使用します。また、最後にアクセスした時間で逆にソートするために、そこで何をソートしているのかもよくわかりません。
find -maxdepth 1 -type f -printf "%A@ %p\0" | sort -zr | sed -z 's/[^ ]* //;'1,${retain}d
0
を使用して、tr \\0 \\n
を改行に変更できます。ゼロ区切りの行をカウントするには、tr -cd '\0' | wc -c
を使用できます。 ファイル内のヌルで区切られたアイテムのカウント・U&L を参照してください。
find -maxdepth 1 -type f -printf "%A@ %p\0"
–サブディレクトリ(-type f
)を検索せずに現在のディレクトリ内のすべてのファイル(-maxdepth 1
)を検索し、"%A@ %p\0"
(改行なし!)を出力します。%A@
は、ファイルのアクセス時間( エポックからの秒数 、%p
はファイル名で、\0
は null文字 、エスケープとディレクティブの完全なリストについては man find
/EXPRESSION/ACTIONS/-printf を参照してください。sort -zr
– z
eroで区切られたデータをr
everse順に並べ替えますsed -z 'a;b
–エントリの区切り文字としてsed
eroを使用して、すべてのエントリでz
式aおよびbを実行します;
(エスケープするか、単一引用符または二重引用符で)だけなので、sed -z s/[^ ]* //\;1,${retain}d
も問題ありません。s/[^ ]* //
– s
ubスペース文字を含まない最初の文字列(=最初のスペース文字までのすべて)と、それに続く何も含まないスペース文字(=削除)1,${retain}d
–最初の$retain
エントリを削除します