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

发布于 2024-12-27 08:23:40 字数 582 浏览 0 评论 0原文

下面的脚本给出了这个错误:

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`

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

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

53
92
8
152
77

并且脚本的调用方式如下: bash del.sh 2

那么 /mydirec/ 应该包含这些目录(因为它删除了那些不是按降序排列的前 2 个目录的目录):

152
92

有人可以吗帮助语法?

The below script gives this error:

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

the script:

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

I would like the script to accept an argument (of num of direcs to keep) then remove all directories (including their containing files) except for the (number passed in the script - ordering by the numerical direc names in descending order).

ie if /mydirec/ contains these direc names:

53
92
8
152
77

and the script is called like: bash del.sh 2

then /mydirec/ should contains these direcs (as it removes those that aren't the top 2 in desc order):

152
92

Can someone please help with the syntax?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦里的微风 2025-01-03 08:23:40
#!/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
#!/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)

Verify the output of the script manually, then execute the script through sh:

./your_script.sh | sh -x
倾`听者〃 2025-01-03 08:23:40

应该阅读:

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 -

Should read:

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

But it is good practice not to parse ls output. Use find instead.

#!/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 -
苦笑流年记忆 2025-01-03 08:23:40

如果要保留两个目录(不是删除),则需要计算目录总数。 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

If you want to leave two directories (not to delete) you need to calculate total number of directories. And xargs utility is more convenient way to pass a list of arguments to 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文