2017-04-07 19 views
0

私は以下の名前形式のファイルを持っています。bash/shell/unixの指定された範囲のファイルを削除

test_1_452161_987654321.ARC 
test_1_452162_987654321.ARC 
test_1_452163_987654321.ARC 
. 
. 
. 
test_1_452190_987654321.ARC 

すなわち私は、ユーザーが以下の入力

Start_File = 452161 
End_File = 452190 

どのような一連のファイルを削除する

を与えるような場合には30個のファイルを削除する必要がありますか? (私は専門家の助けを求めるそのくぼみ仕事ループと取り外しながら、私が使ってみたのbash /シェルプログラミングに新しいです)

はマイコード

echo "Enter Start File" 
read start 
echo "Enter End File" 
read end 

i=$start 
j=$end 

while [$i -le $j]; do 
rm *$i*.ARC 
((i++)) 
done 
+1

whileテストで '['の後と ']の前にスペースを追加すると、スクリプトが動作します。ファイル名の範囲にギャップがある場合は、エラーメッセージを避けるために 'rm -f'を使いたいかもしれません。 – mhawke

答えて

1

for ((i=$start; i<=$end; i++)); do 
    echo rm *_${i}_*.ARC 
done 

で四行目の後にすべてのものを交換し、すべてが正常に見える場合は、echoを削除します。

+0

アンダースコア(_)は、シリーズの前後に常に表示されます(例:_452161_)。 echo rm * _ $ i _ *。ARCが動作していません。それをどのように追加するのですか?助けてください – knkarthick24

+0

私は私の答えを更新しました。 – Cyrus

1

あなたはawk + xargsを使用することができます。

printf "%s\n" test*ARC | awk -v s=452161 -v e=452190 -F_ '$3 >= s && $3 <= e' | xargs rm 

awkはファイル名を_に分割しており、3番目のフィールドが開始/終了範囲内にあるかどうかを確認しています。

+1

あなたの答えはAnubhavaありがとう。間違いなく私はこのアプローチを試み、元に戻す。 – knkarthick24

0

additional documentationの配列を展開したい場合があります。以下のコードは、指定された開始入力と終了入力に基づいて、関心のあるファイル名をエコーし​​ます。

echo -n "Enter Start File => "; read start 
echo -n "Enter End File => "; read end 

for file in *{$start..$end}* 
do 
    echo $file 
done 

EDIT:これはクリーンでクリアなようだ私には

echo "Enter Start File" 
read start 
echo "Enter End File" 
read end 

for i in $(seq $start $end) 
do 
    rm -f *_${i}_*.ARC 
done 

変数展開はちょうどあなたのオプションに追加するbashの

+3

'..'の範囲で変数を使うことはできません。 – Barmar

+0

変数はzshで動作しますが、bashでは正しくありません。 – JarrodCTaylor

0

のzshで動作ではなく、あなたがseqを使用することができます。

関連する問題