2012-01-17 60 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