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

时间:2012-11-16 02:12:05

标签: bash

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

示例:

  

person @ ubuntumachine:〜$ ls

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

该命令将删除文件“abcdef.txt”,“12346.txt”和“helloworld.txt”。

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

谢谢你< 3

3 个答案:

答案 0 :(得分:12)

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

<强> 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:删除找到的所有此类文件

答案 1 :(得分:2)

这样的事情应该有效:

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

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

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

$ !! | sh

重复上一个命令(显示删除文件的rm命令)并将其传递给sh以真正执行它。

答案 2 :(得分:0)

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

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

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