2012-01-17 46 views
2

下面的腳本給出了這樣的錯誤:慶典 - 刪除目錄(包括其內容)的列表

rm: illegal option -- 4 
rm: illegal option -- 5 
rm: illegal option -- 4 
rm: illegal option -- 3 
rm: illegal option -- 2 

腳本:

#!/bin/bash 
keep_no=$1+1 
cd "/mydirec/" 
rm -rf `ls | sort -nr | tail +$keep_no` 

我想腳本來接受參數(NUM的),然後刪除所有目錄(包括它們包含的文件),除了(在腳本中傳遞的數字 - 按數字直接命名名稱降序排列)。

也就是說,如果/ mydirec /包含這些直銷名稱:

53 
92 
8 
152 
77 

和腳本調用,如:bash的del.sh 2

然後/ mydirec /應該包含這些direcs(因爲它消除了那些這不是排名前2):

152 
92 

有人可以請幫忙的語法?

回答

4
#!/bin/bash 
if [[ -z "$1" ]]; then 
    echo "syntax is..." 
    exit 1 
fi 
keep_no=$(($1 + 1)) 
cd "/mydirec/" 
IFS=' 
'; # record separator: only enter inside single quotes 
echo rm -rf $(ls | sort -nr | tail +$keep_no) 

驗證腳本手動的輸出,然後通過SH執行腳本:

./your_script.sh | sh -x 
5

應改爲:

rm -rf `ls | sort -nr | tail -n +$keep_no` 

但它是很好的做法不解析LS輸出。取而代之。

#!/bin/bash 
keep_no=$(($1+1)) 
directory="./mydirec/" 
cd $directory 
rm -rf `find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'| sort -nr | tail -n +$keep_no` 
cd - 
+0

此查找命令將只查找目錄* AND **它也會查找當前目錄'.' – anubhava 2012-01-17 13:14:43

+0

該問題僅針對目錄名稱。你的另一點是正確的。我更新了它。現在用sed刪除當前目錄。 – 2012-01-17 13:17:56

+0

儘管OP似乎通過使用ls命令來刪除文件和目錄。 – anubhava 2012-01-17 13:24:44

0

如果你想留下兩個目錄(不要刪除),你需要計算目錄總數。而xargs實用程序更方便的將參數列表傳遞給rm

#!/bin/bash 
dir="/yourdir" 
total_no=`ls | wc -l` 
keep_no=$(($total_no - $1)) 
ls | sort -nr | tail -n $keep_no | xargs rm -rf