bash - 删除目录列表(包括其内容)

时间:2012-01-17 12:49:57

标签: linux bash shell unix scripting

以下脚本会出现此错误:

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`

我希望脚本接受一个参数(要保留的数量为direcs)然后删除所有目录(包括它们包含的文件),除了(脚本中传递的数字 - 按降序排列数字指令名称)

即如果/ mydirec /包含这些direc名称:

53
92
8
152
77

,脚本调用如:bash del.sh 2

然后/ mydirec /应该包含这些direc(因为它删除那些不是desc顺序中的前2个):

152
92

有人可以帮助解决语法吗?

3 个答案:

答案 0 :(得分:5)

应阅读:

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

但是最好不要解析ls输出。改为使用find。

#!/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 -

答案 1 :(得分: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

答案 2 :(得分: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