删除长度为x个或更多字符的文件

  • 本文关键字:字符 文件 删除 bash
  • 更新时间 :
  • 英文 :


我正在复习考试,其中一个问题是让我写一个命令,删除给定目录中至少6个字符长的文件。

示例:

person@ubuntumachine:约$ls

abc.txt, abcdef.txt, 123456.txt, helloworld.txt, rawr.txt

该命令将删除文件"abcdef.txt"、"12346.txt"one_answers"helloworld.txt"。

我知道在某些时候会使用at,但我不确定用什么来表示6个字符长。。。

谢谢<3

由于问题可以有两种解释,因此给出了两个答案:

1.要删除文件名中包含6个或更多字符的文件:

rm ??????*

解释:

  • ???????的值是按字面输入的。每个?匹配任何单个字符。所以这里的意思是"匹配任意6个字符">
  • *:*通配符匹配零个或多个字符
  • 因此,它会删除任何包含6个或更多字符的文件

或者:

find -type f -name "??????*" -delete

解释:

  • find:调用find命令
  • -type f:只查找文件
  • -name "??????*":匹配任何至少有6个字符的文件,和上面的想法相同
  • -delete:删除发现的任何此类文件

2.删除内容中包含6个或更多字符的文件:

find -type f -size +5c -delete

解释

  • find:调用find命令
  • -type f:只查找文件(不查找目录等)
  • -size +5c:仅查找长度超过5个字符的文件注意:请记住,在这种情况下,EOF(文件结尾)算作一个字符。如果您想从计数器中排除EOF,请将其从5更改为6
  • -delete:删除找到的任何此类文件

这样的东西应该可以工作:

$ ls|while read filename; do test ${#filename} -gt 6 && echo rm "$filename"; done

诀窍是使用${#foo}构造来获取文件名的长度。

一旦您对输出感到满意,请在上一个命令之后立即运行以下命令:

$ !! | sh

这会重复最后一个命令(显示删除文件的rm命令),并通过管道将其发送到sh以真正执行它

这将在当前目录和所有子目录上执行请求的逻辑。

find . -type f -regextype posix-egrep -regex ".*/[^/]{5}[^/]+$" -exec rm -vf {} ;

  • find .
    • 搜索本地目录(更改。在其他地方搜索)
  • -type f
    • 仅考虑文件
  • -regextype posix-egrep
    • 使用egrepregex语法(这就是我所知道的)
  • -regex ".*/[^/]{5}[^/]+$"
    • find将匹配与此正则表达式匹配的所有路径
    • regex解构如下:
      • .*/有效地忽略路径,直到文件名
      • [^/]{5}查找5个非斜杠字符
      • [^/]+$至少需要一个非斜杠字符(因此:6或更多)出现在行($)的末尾
  • -exec rm -vf {} ;
    • find将用其搜索查询匹配的每个文件(在本例中,路径与正则表达式匹配的文件)替换{}。因此,这实现了删除。添加-vf以打印结果,这样您就可以知道发生了什么。
      • -exec对语法很挑剔——如果使用简单的;代替它,则;是避免遇到find: missing argument to '-exec'所必需的
      • 您可以通过使用-print而不是-exec rm -vf {} ;来测试这一点,或者简单地删除-exec rm -vf {} ;(-print是find的默认行为)

相关内容

  • 没有找到相关文章

最新更新