Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:删除一个特定的文件_Bash - Fatal编程技术网

Bash:删除一个特定的文件

Bash:删除一个特定的文件,bash,Bash,Hy, 假设您在一个文件夹中有许多文件,您希望首先按字母顺序对其进行排序,然后删除所有文件,直到找到一个特定的文件(不包括它) 因此,我正在搜索一个函数/命令/脚本/任何以一个字符串作为输入的东西,并删除所有文件,直到该文件。 我想到了一个简单的bash脚本: for i in *; do if [ "$i" == "input" ]; then break; fi rm "$i" done 但是,这是一个相当长的解决方案,而且由于没有指定排序,因此它不能按预

Hy, 假设您在一个文件夹中有许多文件,您希望首先按字母顺序对其进行排序,然后删除所有文件,直到找到一个特定的文件(不包括它)

因此,我正在搜索一个函数/命令/脚本/任何以一个字符串作为输入的东西,并删除所有文件,直到该文件。

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

for i in *; do
   if [ "$i" == "input" ]; then
      break;
   fi
   rm "$i"
 done 
但是,这是一个相当长的解决方案,而且由于没有指定排序,因此它不能按预期工作。有没有短一点的

如果您需要排序,请感谢:

for i in `ls | sort`
do
    if [ "$i" == "input" ]
    then
        break
    fi
    rm "$i"
done
当然,这可以缩短,但这个解决方案可能是最简单和最可读的(这通常是最重要的)。现在,这确实可以正确处理带有空格的文件。

如果需要排序:

for i in `ls | sort`
do
    if [ "$i" == "input" ]
    then
        break
    fi
    rm "$i"
done
当然,这可以缩短,但这个解决方案可能是最简单和最可读的(这通常是最重要的)。现在,这确实可以正确处理带有空格的文件。

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

。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
变量中的任何其他字符)

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

。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
变量中的任何其他字符)

试试看

rm $(ls | sort | sed '/input/,$d')
首先在不使用
rm
as的情况下尝试此操作

ls | sort | sed '/input/,$d'
这里,
input
是捕捉文件名的正则表达式。记住,第一场比赛后一切都会过去的

试试看

rm $(ls | sort | sed '/input/,$d')
rm `ls |sed '/pattern/,$d'`
首先在不使用
rm
as的情况下尝试此操作

ls | sort | sed '/input/,$d'
这里,
input
是捕捉文件名的正则表达式。记住,第一场比赛后一切都会过去的

rm `ls |sed '/pattern/,$d'`
默认情况下,ls输出按字母顺序排序

用正则表达式替换模式,该正则表达式与要删除的第一个文件相匹配。除非有什么奇怪的事情发生,否则pattern可以只是停止删除的文件名。或者使用“^filename$”确定模式

和往常一样,在做之前先测试。例如,在开始处添加“echo”以仅打印要执行的操作

echo rm `ls |sed '/pattern/,$d'`
默认情况下,ls输出按字母顺序排序

用正则表达式替换模式,该正则表达式与要删除的第一个文件相匹配。除非有什么奇怪的事情发生,否则pattern可以只是停止删除的文件名。或者使用“^filename$”确定模式

和往常一样,在做之前先测试。例如,在开始处添加“echo”以仅打印要执行的操作

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


如果文件名包含空格,则会导致错误。我知道这可以通过“ls | sort | while read line”来修复,但它会使代码更长。无论如何谢谢你!哦,是的,我忘了空间问题。。。如果添加引号,它仍然有效(至少在我的机器上是如此)。带有*的路径名扩展已经排序。如果文件名包含空格,“并且不解析ls”,则会导致错误。我知道这可以通过“ls | sort | while read line”来修复,但它会使代码更长。无论如何谢谢你!哦,是的,我忘了空间问题。。。如果添加引号,它仍然有效(至少在我的机器上是如此)。带有*的路径名扩展已经排序。“并且不要解析ls。”管道化ls将导致转义字符和分词出现问题。(我认为这对文件名中的空格不起作用)#Rob,ls和sort是显而易见的,sed搜索输入正则表达式,并从匹配(,)的第一行开始删除(d)直到文件结尾($)。剩下的内容到达stdout.ls将导致转义字符和分词出现问题。(我认为这对文件名中的空格不起作用)#Rob,ls和sort是显而易见的,sed搜索输入正则表达式,并从匹配(,)的第一行开始删除(d)直到文件结尾($)。剩下的东西到达了标准输出。有人刚刚告诉我“*”已经对它的输入进行了排序。如果这是真的,你的东西应该按原样工作。@litb-证实。在路径名扩展部分下的bash手册页中,它使用了短语“按字母顺序排序的列表”。有人刚刚告诉我“*”已经对其输入进行了排序。如果这是真的,你的东西应该按原样工作。@litb-证实。在路径名扩展部分下的bash手册页中,它使用了短语“按字母顺序排序的列表”。关于解析ls输出的有趣文章。如果您有机会遇到如此疯狂的文件名,或者在面对不可信的输入(目录内容)时需要安全性,请考虑这一点。总的来说,这似乎是一个很难接受的建议。如果您想替换
ls
以获得文件列表(我想您应该跳过
rm
的目录名)。使用,
find-键入f
。这与“从不解析”点有什么关系?它也适用于查找输出,不是吗?似乎find正在抓到一个不同的痒点——对递归的渴望和对当前目录的渴望。@John M:
find
的输出是可靠的,可以被解析。
ls
的输出为“仅限眼睛”。阅读我在上面的评论中引用的页面