Bash:删除直到特定文件

时间:2009-06-15 17:21:02

标签: bash

HY, 假设您在文件夹中有很多文件,并且您希望首先按字母顺序对其进行排序,然后删除所有文件,直到特定文件(不包括它)为止。

所以即时搜索一个函数/命令/脚本/将一个字符串作为输入的任何内容,并删除所有文件,直到该文件。

我想到了一个简单的bash脚本:

for i in *; do
   if [ "$i" == "input" ]; then
      break;
   fi
   rm "$i"
 done 

但是这是一个相当长的解决方案,并且它不能正常工作,因为未指定排序。是不是有一个较短的?

由于

4 个答案:

答案 0 :(得分:2)

尝试,

rm $(ls | sort | sed '/input/,$d')

首先尝试不使用rm

ls | sort | sed '/input/,$d'

在这里,input是您捕获文件名的正则表达式。请记住,第一场比赛结束后的所有事情都会进行!

答案 1 :(得分:2)

rm `ls |sed '/pattern/,$d'`

ls输出默认按字母顺序排序。

将模式替换为与要删除的第一个文件匹配的正则表达式。除非有任何花哨的东西,否则pattern可以只是要停止删除的文件的名称。或者使用“^ filename $”确定模式。

一如既往,在做之前进行测试。例如,在开头添加“echo”以打印将要执行的操作。

echo rm `ls |sed '/pattern/,$d'`

答案 2 :(得分:1)

这似乎有效($i是要删除的文件名)

find . -maxdepth 1 -type f | sort | 
    while read -r line && [[ $line < $i ]]; do 
        echo $line
    done

如果您确定它符合您的要求,请用

替换echo命令
rm "$line"

Never pipe ls for processing things。 ls不是为了那个任务而做的。使用路径名扩展或find之类的工具。

示例失败案例:

$ echo > 'I have fun.mp3'
$ cat $(ls | grep 'have fun')
cat: I: No such file or directory
cat: have: No such file or directory
cat: fun.mp3: No such file or directory

它将$(...)的结果拆分为单词,并将这些单词作为单独的参数传递。因此,rm不会看到整个名称,而是分成它的单词。

在分词后完成路径名扩展,因此分词不再影响其结果。这就是为什么cat *将正确处理空格(或为此目的,IFS变量中的任何其他字符)。

答案 3 :(得分:0)

如果你想要排序:

for i in `ls | sort`
do
    if [ "$i" == "input" ]
    then
        break
    fi
    rm "$i"
done

当然,这可以缩短,但这个解决方案可能是最简单和最易读的(通常最重要)。这个现在正确处理带空格的文件。