2017-04-07 56 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個文件? (我是新來砸向/ shell編程我試着用while循環,並刪除其力的工作,以便尋求專家幫助)

我的代碼

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 _ *。這是不起作用的。我如何添加?請幫助我 – 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 

編輯:變擴建工程中的zsh但不是來砸

+3

您不能在'..'範圍內使用變量。 – Barmar

+0

變量在zsh中工作,但不在bash中,你是正確的。 – JarrodCTaylor

0

只需添加到您的選擇,您可以使用seq

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

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

對我來說,這似乎是簡潔明快。