我正在复习考试,其中一个问题是要求我编写一个命令,删除给定目录中至少6个字符长的文件。
示例:
person @ ubuntumachine:〜$ ls
abc.txt, abcdef.txt, 123456.txt, helloworld.txt, rawr.txt
该命令将删除文件“abcdef.txt”,“12346.txt”和“helloworld.txt”。
我知道*会在某些时候使用,但我不知道用什么来表示6个字符长......
谢谢你< 3
答案 0 :(得分:12)
由于这个问题可以有两种解释,因此给出了两个答案:
<强> 1。删除文件名中包含6个或更多字符的文件:
rm ??????*
说明:
??????
:?
字面输入。每个?
匹配任何单个字符。所以这里的意思是“匹配任意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
-regex ".*/[^/]{5}[^/]+$"
.*/
有效地忽略了文件名[^/]{5}
找到5个不斜杠的字符[^/]+$
至少需要一个字符(因此:6个或更多),而不是在行尾之前出现的斜杠($)-exec rm -vf {} \;
{}
替换为其搜索查询匹配的每个文件(在这种情况下,文件的路径与我们的正则表达式匹配)。因此,这实现了删除。添加-vf
以打印结果,以便您知道发生了什么。
-exec
对语法很挑剔 - 如果在其位置使用简单的\;
,find: missing argument to '-exec'
是必要的,以避免遇到;
。-print
代替-exec rm -vf {} \;
进行测试,或者只是移除-exec rm -vf {} \;
(-print
是查找的默认行为)