「ディレクトリにx以上のファイルがある場合は最も古いファイルを削除する」シェルスクリプトが機能しないのはなぜですか? [コピー]

「ディレクトリにx以上のファイルがある場合は最も古いファイルを削除する」シェルスクリプトが機能しないのはなぜですか? [コピー]

タイトルがひどすぎてすみません。タイトルは私が説明できる最高の言葉です。

したがって、一部のサーバーデータのバックアップtarを作成して/server/backupsに保存するバックアップスクリプトがありますが、先週のバックアップのみが必要なため、毎週のタスクとして実行し、バックアップフォルダをクリーンアップするためにこのスクリプトを作成しました。

#!/bin/bash
#initializing a with the amount of backup archives and b with the target max
a=find /server/backups/ -type f | wc -l
b=14

#if there are more backup files than target max
#delete the oldest files
if [ $a > $b ]
then
    ls -1t /server/backups/ | tail -n +15 | xargs rm -f
fi  

しかし、うまくいきません。私はLinuxに初めて触れ、「デバッグ」する方法を知りません。

答え1

a=find /server/backups/ -type f | wc -l

その後、コマンドが実行され、/server/backups/環境a変数がfind。あるいは、実際には末尾のスラッシュのためにエラーが発生した可能性があります。あなたが望むものは一つです。コマンドの置き換え

if [ $a > $b ]

>ここはひも比較すると、例えば。2より大きいでしょう14。変数を引用する必要がありますが、数字のみを含む場合は問題にならない可能性があります。

ls -1t /server/backups/ | tail -n +15 | xargs rm -f

これには、スペース、引用符、または改行文字を含むファイル名には明らかな問題があります(xargs入力がデフォルトで解釈される方法と行の処理tailによる)。ただし、これを無視できる場合は、ファイル名が「nice」の場合そしてGNU xargsがあれば実行できます

ls -t /server/backups/ | tail -n +15 | xargs -d '\n' -r rm

tail15行未満の場合、出力は空であるためです。-d '\n'デフォルトでは、引用符で囲むことができるスペースで区切られた単語の代わりに行全体を読み取るようにxargsに指示し、引数なしで-rコマンドを実行しないように指示します。標準機能ではありません。

関連情報