以下脚本会出现此错误:
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
有人可以帮助解决语法吗?
答案 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