1

次のスクリプトを頻繁に呼び出します

クリーンアップ.sh

#!/bin/bash
DEFAULT_LIMIT=10
INPUT=$1
PATTERN=$2
LIMIT=$3

if [ "$INPUT" == "" ] || [ "$PATTERN" == "" ]
then
        echo "usage: $0 INPUT PATTERN [LIMIT]"
        exit 1;
fi
if [ "$LIMIT" == "" ]
then
        LIMIT=$DEFAULT_LIMIT
fi

find /var/project/project1 -maxdepth 1 -type d -name "${INPUT}-${PATTERN}*" -printf '%T@ %p\n'|sort -nr|tail -n+$LIMIT|cut -f 2- -d " "|xargs -i rm -rf {}

$LIMITしたがって、これはプレフィックス付きの最後の 2 番目のディレクトリを から削除することになっており、$INPUT-$PATTERN予期/var/project/project1せず (非常に重要ではありますが) 意図したもの以外のディレクトリを から削除することはめったにありません/var/project/project1。理由はありますか?2- のカットの動作は適切に定義されていますか? f と field# の間にスペースを入れることはできますか? これは意図的に書かれたものではなくバグですが、このコードが予期しない削除の原因であるかどうかは定かではありません。

これはめったに再現できないため、これを修正cut -f2 -d " "することで問題が解決するかどうかはわかりません ( )

4

2 に答える 2

3

現在の実装は、スペースを含むファイルで壊れます。これは の性質でありxargs、 -0 を使用しない限り危険と見なされる理由です (現在のレイアウトでは使用できません)。

xargs例として、 「foo bar」という名前のファイルが作成されたとします。xargs次のように rm を呼び出します。

rm -rf foo bar

「foo bar」を削除する代わりに、 というファイルと というファイルを削除しfooますbar。切り取りコマンドを-f2の代わりに変更して-f2-も、スペースを含むファイルで中断されますが、削除されるのは のみfooです。

考えられるすべてのファイル名を処理する例を次に示します。

#!/bin/bash
input=$1
pattern=$2
limit=${3:-10} # use 10 if $3 is not set

if [[ -z $input || -z $pattern ]]
then
        echo "usage: $0 INPUT PATTERN [LIMIT]"
        exit 1;
fi

dirs=()
while IFS= read -r -d '' latest # \0 is used as a delimiter, since it is not valid in a filename
do 
   dirs+=("$latest") # append files to the array in mtime sorted order, oldest first
done < <(find /var/project/project1 -maxdepth 1 -type d -name "${input}-${pattern}*" -printf '%T@ %p\0' | sort -zn)

dirs=("${dirs[@]#* }") # remove mtime from the elements
rm -rf "${dirs[@]:0:$limit}"
于 2012-08-30T02:43:39.593 に答える
0

echo "one" | cut -f 2 -d " "2 番目のフィールドを要求しても、「1」と表示されることに注意してください。

cut -f 2- -d " "では、電話をかけたときにフィールドが 1 つしかない場合、何を期待しますか? 何もない場合は、オプションを追加し-sます。

つまり変わる

cut -f 2- -d " "

cut -s -f 2- -d " "

それが役に立てば幸い。

于 2012-08-30T04:05:21.643 に答える