获取目录文件日期并比较

-----------对目录操作----------------
pocdata_exp_from_172.20.8.23_nscrmdb_20140907.0200

1、根据修改时间和当前时间比较、目录名称进行筛选,再直接删除
find . -maxdepth 1 -follow -type d ! -mtime -7 -name "pocdata_exp_from_*" | xargs rm -rf
(1) -maxdepth 1 表示只找到第一层
(2)-type d表示目录 -type f表示文件
(3)除了mtime还可以使用-newer参数
(4)删除也可使用命令-exec rm -rf

2、先筛选目录,再用awk根据目录修改时间(时间戳)和目标时间比较,再直接删除 --循环中添加处理为自主产权
ls -F | grep ‘/$‘|grep pocdata_exp_from | awk ‘{cmd="date +%s --date=\"-1 day\"";cmd|getline a;for(i=1;i<=NF;i++){cmd="stat -c %Y "$i"";cmd|getline b;if(b<a){print $i}}}‘
(1)删选目录ls -F | grep ‘/$‘|grep pocdata_exp_from
(2)时间还以用"$(date -d "7 days ago" "+%Y%m%d")"
(3)ls|awk ‘{for(i=1;i<=NF;i++){print NF,$i}}‘
(4)ls|awk ‘{for(i=1;i<=NF;i++){cmd="stat -c %Y "$i"";cmd|getline b;print b,NF,$i}}‘

3、先筛选出目录,再筛选出符合时间的目录(根据目录名中的时间),删除
find . -maxdepth 1 -type d -name "pocdata_exp_from_*" |sed ‘s/\(.*\)\([0-9]\{8\}\)\(.*\)/\2/‘

-----对非目录操作-----只是获取时间的字符串-------------
-rw-r--r--. 1 aiweb_s aigrp 13408625 2014-08-06 13:30:30.913401174 +0800 catalina.out
现在需要提取该文件的时间属性,显示为: 20140806133030

1、
ls -l --full-time catalina.out |sed -e ‘s/\(.*\)\([0-9]\{4\}-[0-9]\{1,2\}-[0-9]\{1,2\} [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\)\(.*\)/\2/‘ -e ‘s/[- :]//g‘
(1)“s//”替换,"//“中间包含了三部分,看做一个整体替换成其中第二部分
(2)“/[- :]//g”,将三个符号全替换为空
(3)-e 执行多个sed命令,应该可以用";"分隔,放在一个"‘ ’"中

2、
stat catalina.out |sed -n ‘6 s/[- :\(Modify\)]//gp‘|awk -F. ‘{print $1}‘
(1)取stat结果的第六行,去掉其中的"-""Modidfy"" "":"符号
(2)将上面的结果以"."分隔,取第一部分

3、直接用awk做列的分隔
awk ‘BEGIN {FS="[-:. ]";OFS="";"ls -l --full-time catalina.out " |getline;print $13,$14,$15,$16,$17,$18}‘
(1)BEGIN{}预置了内部变量FS字段分隔符,上面句子中用的正则,OFS为反向输出分隔(上面的语句中其实就是合并分割后的各字段)
(2)其他RS/ORS行分隔符(RS默认"\n") http://blog.51yip.com/shell/1151.html
(3)getline 通过管道或者标准输入读入,如果读取成功,getline返回1;如果读到文件结束符(EOF),getline返回0;如果发生错误,例如打不开文件,getline返回-1,所以,getline可以用于while循环中

=================================================
sed命令的两个作用:匹配+操作(分割替换等)
sed ‘/^\.\/\([0-9]\{8\}\)$/!d; s//\1/‘
(1)sed使用的正则表达式是括在斜杠线"/"之间的模式:^\.\/\([0-9]\{8\}\)$ ("./"后面连续8个0-9的数字)
^匹配开头,$匹配结尾
“.” 匹配除换行符以外的单个字,这里前面加了个“\”转义,就表示“.”本身
\(..\)保存已匹配的字符
[]匹配指定字符组内的任一字符
x\{m\} 连续m个x
(2)!d删除其他行
(3)s//\1/‘

=================================================

偶尔在一个shell脚本里面看到了一个类似sed ‘s/(\(.*\))/\1\1/‘这样的语句,其实这个sed替换就是针对含有括号的情况

no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)
其中AAABBBCCCDDD都是变化的,我们要提取AAA或者BBB的情况

首先理解一个()的情况
举个例子:
[[email protected] root]# echo "111(222)333"| sed ‘s/(\(.*\))/\1\1/‘
111222222333

因为(\(.*\))只有这一个部分,所以\1就意味着这一个部分提取两次(如果是\2就应该提不到东西)

[[email protected] root]# echo "111(222)333"| sed ‘s/(\(.*\))/\1\2/‘
sed:-e 表达式 #1,字符 16:Invalid reference \2 on `s‘ command‘s RHS

由于"("不是元字符,所以直接写"("(就表示"("这个符号,而"\("才表示包含什么的意思

而又因为是()里面的内容,所以将222提取两次

如果将()去掉,例如
[[email protected] root]# echo "111(222)333"| sed ‘s/\(.*\)/\1\1/‘
111(222)333111(222)333
那么提取的匹配就是这个部分了

-------------------------------------
[[email protected] root]# echo "111(222)333"| sed ‘s/\(.*\)(\(.*\))/\1\1\1/‘
111111111333
因为//里面是由\(.*\) 和 (\(.*\))两部分组成,而\1仍然是提取第一部分,也就是(222)前的所有内容和(222)这个整个部分替换为(222)前的所有内容提取三次,其后的333不变

[[email protected] root]# echo "111(222)333"| sed ‘s/\(.*\)(\(.*\))/\2\2\2/‘
222222222333
将(222)前的所有部分和(222)看成一个整体,被替换为()内的部分,也就是222。

此处理解\2\2\2,2的含义应该是提取第二个\(.*\)即:“第二个包含” 得意思也就是:(将()换成yy也是一样得含义)
[[email protected] root]# echo "111y222y333"| sed ‘s/\(.*\)y\(.*\)y/\2\2\2/‘
222222222333

-------------------------------------
两个括号及其以上得情况:

[[email protected] root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed ‘s/\(.*\)(\(.*\)).*/\2/‘
DDD
[[email protected] root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed ‘s/.*(\(.*\)).*/\1/‘
DDD
以上两句意义相同。
我们本想取到AAA,但是为什么取了DDD呢
正则表达式是有贪婪性的,它总是与最长的可能长度匹配,而且越是排在前面的通配符优先级越高。按照这样的原则取到得就是DDD了,那么我们应该如何取得AAA呢?

我们考虑如果在模式串中第一个".*"中告诉sed这个".*"是不能含有"("的,同时第二个".*"中不能含有""应该OK吧--[benmm]应该是第二个".*"中不能含有")"吧
试一试:
[[email protected] root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed ‘s/[^(]*(\([^)]*\)).*/\1/‘
AAA

以此类推,可以得到
[[email protected] root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed ‘s/[^(]*(\([^)]*\))[^(]*(\([^)]*\))[^(]*(\([^)]*\))[^(]*(\([^)
]*\))/\2/‘
BBB
将2改为3就是CCC
将3改为4就是DDD

时间: 2025-01-06 22:18:52

获取目录文件日期并比较的相关文章

C++获取目录文件列表

获取,指定目录的子文件列表,支持递归获取子目录,支持Win32和类Unix系统. #ifndef _FILE_HELPER_H__ #define _FILE_HELPER_H__ class FileHelper { public: /** @brief 获取指定文件夹内的文件路径列表 @param string basePath 要搜索的目录路径 @param bool searchSubDir 是否递归搜索子目录 @std::vector<std::string > &files

php 获取目录文件

1 用户 opendir 函数 $dir = "D:/";  //要获取的目录 //先判断指定的路径是不是一个文件夹 if (is_dir($dir)){ if ($dh = opendir($dir)){ while (($file = readdir($dh))!= false){ //文件名的全路径 包含文件名 $filePath = $dir.$file; } closedir($dh); } } 2 用户 glob 函数 $dir = "D:/";  //

C#FTP操作类含下载上传删除获取目录文件及子目录列表等等

ftp登陆格式  : ftp://[帐号]:[密码]@[IP]:[端口] ftp://用户名:密码@FTP服务器IP或域名:FTP命令端口/路径/文件名 直接上代码吧,根据需要选择函数,可根据业务自己修改,如日志记录,提示等等 using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net; using System.Windows.Forms; using

linux获取目录下文件

查看当前目录下的文件:find . -type f查看当前目录下的文件夹: find . -type d如果文件file1不为空: if [ -s file1 ];then       echo "file1 不为空"fi #!/bin/sh for f in `find ./testdir -type f`; do         if [ -s $f ];then                 echo $f is not empty.                 echo 

IOS中获取各个文件的目录路径的方法和NSFileManager类

转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有

Perl获取目录下文件或者包含子目录下文件

1 my $dir = "D:\\My_Work\\Temp"; 2 my @files = (); 3 4 #获取给定目录下文件 5 @files = get_dir_files($dir); 6 7 #获取给定目录以及子目录下文件 8 @files = get_dir_files_x($dir); 9 10 #获取目录下以及子目录下文件,返回的结果中包含路径 11 sub get_dir_files_x{ 12 my ($dir_p) = @_; 13 my @files = ()

使用windows API函数获取目录下所有文件名---目录下文件的扫描和处理

直接上代码 // test_max.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include <Shlwapi.h> #include <iostream> #include <string> #include <vector> #pragma comment(lib,"shlwapi.lib") //注意放置的位置

IOS中获取各种文件的目录路径的方法

iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,

Java非递归的方式获取目录中所有文件(包括目录)

零.思路解析 对于给出的文件查看其下面的所有目录,将这个目录下的所有目录放入待遍历的目录集合中,每次取出该集合中的目录遍历,如果是目录再次放入该目录中进行遍历. 一.代码 /** * 非递归的方式获取目录中的所有文件<br> * 此方法获取的路径未按照目录->文件方式排列 * * @param dirPath 目录路径 * @return 指定目录下所有文件和目录的集合 */ public static List<File> listAllFile(String dirPat