Linux中如何列出早于指定天数的文件夹且不显示其内部内容?
解决方法:列出当前目录下早于30天的子文件夹(仅显示名称)
你遇到的核心问题是之前的命令要么会递归列出文件夹内的内容,要么输出带路径的目录名,或者因为语法错误导致无输出。下面是几个精准的解决方案:
方法1:使用find的-printf直接输出文件名(推荐)
这个命令最简洁高效,直接让find输出你需要的内容:
find . -maxdepth 1 -type d -mtime +30 ! -name "." -printf "%f\n"
参数解释:
-maxdepth 1:限制仅查找当前目录下的一级子目录,避免递归搜索子目录内部的文件夹-type d:只筛选目录类型的条目-mtime +30:匹配修改时间早于30天的条目! -name ".":排除当前目录本身(因为find .会默认匹配到当前目录./)-printf "%f\n":仅输出目录的纯名称(自动去掉./前缀)
方法2:用basename提取纯名称
如果你的find不支持-printf(比如某些老旧系统),可以用basename来剥离路径:
find . -maxdepth 1 -type d -mtime +30 ! -name "." -exec basename {} \;
方法3:用awk处理ls -ld的输出
针对你之前尝试的ls -ld命令,我们可以用awk去掉路径前缀:
find . -maxdepth 1 -type d -mtime +30 ! -name "." -exec ls -ld {} \; | awk '{sub(/^\.\//, "", $NF); print $NF}'
这里sub(/^\.\//, "", $NF)会把输出最后一列的./前缀替换为空,只保留目录名称。
为什么你之前的命令失效?
第一个命令:
find . -type d -mtime +30 -exec ls {} \;ls {}会执行ls查看目标目录内的所有内容,所以会把文件夹里的2.prop这类文件也列出来,这不是你要的结果。第二个命令:
find . -type d -mtime +30 -exec ls -l {} \; | grep '^d' | awk ‘{print $9}’
问题有两个:一是ls -l {}输出的是目标目录内的文件/文件夹,其中大部分是文件,grep '^d'几乎匹配不到内容;二是你用了中文单引号(‘’),shell无法识别这种符号,会导致语法错误。第三个命令:
find . -type d -mtime +30 -exec ls -ld {} \;
这个命令已经正确找到了目标目录,但输出的是带./前缀的完整路径(比如./2),你只需要去掉前缀就能得到想要的纯名称。
内容的提问来源于stack exchange,提问作者Arpit Gupta
相关产品推荐
相关产品推荐

