HY, 假设您在文件夹中有很多文件,并且您希望首先按字母顺序对其进行排序,然后删除所有文件,直到特定文件(不包括它)为止。
所以即时搜索一个函数/命令/脚本/将一个字符串作为输入的任何内容,并删除所有文件,直到该文件。
我想到了一个简单的bash脚本:
for i in *; do
if [ "$i" == "input" ]; then
break;
fi
rm "$i"
done
但是这是一个相当长的解决方案,并且它不能正常工作,因为未指定排序。是不是有一个较短的?
由于
答案 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
当然,这可以缩短,但这个解决方案可能是最简单和最易读的(通常最重要)。这个现在正确处理带空格的文件。