linux命令--查找指定日期文件,-newermt的使用

本文介绍在Linux系统中使用find命令查找指定时间或时间段之间的数据。通过示例展示了查找指定日期文件并以特定格式显示,以及查找并删除指定日期文件的命令。还给出避免误操作的小技巧,同时对命令中的参数和删除操作进行了解释。

使用find命令查找指定时间或时间段之间的数据,涉及到参数mtime

 

命令时间线:

今天:2020-11-11

系统时间:2020-11-11 11:11:11

以今天为基准值,

---------------------------------

find /lt/logs/ -type f -name "*" -newermt '2020-11-08' ! -newermt '2020-11-10' | xargs ls -lt

代表查找11-08,11-09两天的数据并以ls -lt格式进行显示;

-type f:代表一般文件,

-type d:d代表目录(文件夹),

 

小技巧:

为了避免下一步删除出现失误,也为了避免在查找时没有找到文件而将当前您所在目录的文件列表输出,在执行这两条命令之前,您可以建一个空目录,在这个空白目录里面进行操作,这样,每次查找到或未查找到都能方便验证,结果显示比较直接。

---------------------------------

 

==查找指定日期之间的文件,并删除===

find /lt/logs/ -type f -name "*" -newermt '2020-11-08' ! -newermt '2020-11-10' -exec rm {} \;

代表查找11-08,11-09两天的数据并进行删除,没有删除确认框;

 

---------------------------------

 

备注:

| xargs ls -lt

xargs:代表将迁移查找出来的文件进行使用下一个命令【ls -lt】继续进行处理。

 

 

删除的解释:【来源于“百度知道https://zhidao.baidu.com/question/551356621810102292.html”】

问:find /lt/logs/ -name "*.pcap" -newermt '2020-11-08' ! -newermt '2020-11-10' -exec rm {} \;

答:

find /lt/logs/ -name "*.pcap" -newermt '2020-11-08' ! -newermt '2020-11-10' -exec rm {} \;意思从/lt/logs/当前目录查找以.pcap为文件后缀名的所有文件;

-exec 是表示查找后紧接着执行的命令,因为rm不接受管道输入,所以不能写成find /lt/logs/ -name "*.pcap" -newermt '2020-11-08' ! -newermt '2020-11-10' | rm的形式,

rm就是删除文件的意思;

{} 代表的是把find 到的结果传给-exec作为参数 ;

-exec 参数必须用分号;结尾,但是在shell中不懂分号;是什么鬼,所有要用转义符\加分号,所以就有了\;

<think>我们正在讨论如何使用`ls`命令日期范围过滤目录。根据引用[4],我们可以使用`find`命令来按时间过滤文件,但用户明确要求使用`ls`命令。然而,`ls`命令本身并不支持直接按日期范围过滤。因此,我们需要结合其他命令(如`find`)来实现。 但是,用户的问题中提到了引用[2]和引用[4],引用[2]介绍了`ls`命令的一些用法,引用[4]则介绍了使用`find`按时间过滤文件的方法。因此,我们可以这样回答: 1. 首先说明`ls`命令本身不支持按日期范围过滤,但可以结合`find`命令来实现。 2. 使用`find`命令查找特定日期范围内的目录,然后结合`ls`命令来显示这些目录。 根据引用[4]中的示例,我们可以使用`find`命令的`-newermt`选项来指定时间范围。例如,查找在2023-01-01到2023-12-31之间的目录: ```bash find /path/to/dir -type d -newermt '2023-01-01' ! -newermt '2023-12-31' ``` 然后,我们可以将`find`的结果通过管道传递给`ls`命令来显示详细信息。但是要注意,如果目录名包含空格或特殊字符,直接传递可能会有问题。因此,我们可以使用`-exec`选项来调用`ls`。 例如: ```bash find /path/to/dir -type d -newermt '2023-01-01' ! -newermt '2023-12-31' -exec ls -ld {} \; ``` 这样,`find`会为每个找到的目录执行`ls -ld`命令,从而显示目录的详细信息。 但是,用户要求使用`ls -d`,而`ls -d`通常用于显示目录本身而不是其内容。在上面的命令中,我们使用`ls -ld`,其中`-l`是显示详细信息,`-d`是防止列出目录内容(只显示目录本身)。所以,这符合要求。 另外,引用[2]中提到`ls -d */`可以列出当前目录下的子目录,但这里我们需要按日期过滤。 因此,我们可以总结如下: 步骤: 1. 使用`find`命令查找指定日期范围内的目录。 2. 使用`-exec`参数来执行`ls -ld`(相当于`ls -d -l`)来显示这些目录的详细信息。 注意:`-newermt`用于指定时间,`! -newermt`表示不晚于某个时间,即早于或等于。 示例:查找当前目录下在2023年内的目录并显示详细信息: ```bash find . -type d -newermt '2023-01-01' ! -newermt '2023-12-31' -exec ls -ld {} \; ``` 如果只想显示目录名而不显示详细信息,可以去掉`-l`: ```bash find . -type d -newermt '2023-01-01' ! -newermt '2023-12-31' -exec ls -d {} \; ``` 但是,这样显示可能会因为每个目录都单独执行`ls`而出现多个结果,而且目录名会分行显示。如果希望在一行显示,可以使用`-print0`和`xargs`,但这样可能会失去按日期排序的能力。 另外,我们也可以使用`ls`来列出这些目录,但需要先将目录列表保存。不过,最直接的方法还是使用`find`的`-exec`。 因此,我们给出两种方法: 方法一:使用`find ... -exec ls -ld {} \;` 显示每个目录的详细信息(包括时间,方便确认)。 方法二:使用`find ... -print0 | xargs -0 ls -ld` 来一次性列出。 但是方法二需要注意,如果文件数量很多,可能会超出命令行参数限制。方法一则没有这个问题。 另外,引用[3]中提到了使用`ls -l`结合`grep`和`wc`来统计文件个数,这里我们不需要统计,但可以借鉴其思路。 然而,按日期范围过滤目录,使用`find`是最合适的。 所以,最终回答: 虽然`ls`命令本身不支持按日期范围过滤,但可以通过`find`命令配合实现。具体步骤如下: 1. 使用`find`命令的`-newermt`选项指定时间范围。 2. 使用`-type d`选项限定只搜索目录。 3. 通过`-exec`参数调用`ls -ld`来显示目录的详细信息。 示例:查找当前目录下在2023-01-01到2023-12-31之间创建的目录: ```bash find . -type d -newermt '2023-01-01' ! -newermt '2023-12-31' -exec ls -ld {} \; ``` 注意: - `-newermt '2023-01-01'` 表示修改时间晚于2023-01-01(即大于等于该日期)。 - `! -newermt '2023-12-31'` 表示修改时间不晚于2023-12-31(即小于等于该日期)。 - 时间格式可以是`YYYY-MM-DD`或`YYYY-MM-DD HH:MM:SS`。 另外,如果只想显示目录名(而不显示详细信息),可以使用: ```bash find . -type d -newermt '2023-01-01' ! -newermt '2023-12-31' -exec ls -d {} \; ``` 但这样每个目录会单独显示一行,且没有详细信息。 如果希望按照修改时间排序,可以在`find`命令后加上`| sort`,但`find`输出的顺序并不是按时间的,所以我们可以使用: ```bash find . -type d -newermt '2023-01-01' ! -newermt '2023-12-31' -printf "%T@ %p\n" | sort -n | cut -d' ' -f2- | xargs ls -ld ``` 这个命令比较复杂,它使用`-printf`输出时间戳和目录名,然后按时间戳排序,再移除时间戳,最后用`xargs`传递给`ls`。但要注意目录名中的空格问题,所以更安全的做法是使用`-print0`和`xargs -0`,但这样就不能用`cut`了。因此,如果目录名没有特殊字符,可以这样用。 考虑到安全性和简洁性,推荐使用第一种方法(使用`-exec`),虽然它可能慢一些,但是安全可靠。 最后,引用[2]中提到`ls -d */`可以列出当前目录下的子目录,但这里我们要求按日期过滤,所以不能直接使用。 因此,我们使用`find`命令来实现。 总结:使用`find`配合`-exec`执行`ls`命令来显示特定日期范围内的目录。</think>### 在Linux使用`ls`命令日期范围过滤目录的方法 虽然`ls`命令本身**没有直接支持日期范围过滤**的功能,但可以通过结合`find`命令实现按日期范围过滤目录的需求。以下是具体方法和步骤: #### 方法一:使用`find` + `ls`组合(推荐) ```bash find . -type d -newermt "起始日期" ! -newermt "结束日期" -exec ls -ld {} \; ``` **参数解析**: - `-type d`:只搜索目录 - `-newermt "YYYY-MM-DD"`:修改时间晚于指定日期 - `! -newermt`:排除晚于结束日期的目录 - `-exec ls -ld {} \;`:对找到的目录执行`ls -ld`命令 **示例**:列出2023年创建的目录 ```bash find . -type d -newermt "2023-01-01" ! -newermt "2023-12-31" -exec ls -ld {} \; ``` #### 方法二:纯`find`命令输出 ```bash find . -type d -newermt "起始日期" ! -newermt "结束日期" -ls ``` 这会直接以`ls -dils`格式输出结果,更简洁高效[^4]。 #### 方法三:结合时间戳过滤(精确到分钟) ```bash find . -type d -newermt "2023-06-01 08:00" ! -newermt "2023-06-15 17:30" ``` #### 注意事项 1. **时间格式**:日期必须使用`YYYY-MM-DD`格式,时间用`HH:MM`(24小时制) 2. **符号含义**: - `-newermt`:修改时间晚于(包含等于) - `! -newermt`:修改时间早于(包含等于) 3. **隐藏目录**:添加`-name ".*"`可包含隐藏目录 4. **递归搜索**:默认搜索子目录,添加`-maxdepth 1`限制当前目录 > ⚠️ **重要提示**:`ls`命令本身**不支持日期范围过滤**,必须结合`find`实现。直接使用`ls -l --time-style=+"%Y-%m-%d"`只能格式化时间显示,无法过滤[^2][^4]。 #### 完整示例:统计2023年Q2创建的目录 ```bash find ~/projects -type d -newermt "2023-04-01" ! -newermt "2023-06-30" -ls ``` 输出示例: ``` 123535 4 drwxr-xr-x 5 user group 4096 Jun 15 14:30 ./project1 123678 4 drwxr-x--- 2 user group 4096 May 22 09:15 ./project2/docs ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值