我正在复习考试,其中一个问题是让我写一个命令,删除给定目录中至少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的默认行为)
- find将用其搜索查询匹配的每个文件(在本例中,路径与正则表达式匹配的文件)替换