Linux 如何找到包含最后日期的测试的目录?
我有一个目录,有很多文件和目录, 我想查找名称格式为日期的目录: p**U yyyymmdd 我是否可以编写一个命令来查找(通过名称而不是时间戳)在shell脚本中显示具有最后日期(最高yyyy、最高mm、最高dd)的目录名 在此处添加文件名示例:Linux 如何找到包含最后日期的测试的目录?,linux,bash,shell,sed,grep,Linux,Bash,Shell,Sed,Grep,我有一个目录,有很多文件和目录, 我想查找名称格式为日期的目录: p**U yyyymmdd 我是否可以编写一个命令来查找(通过名称而不是时间戳)在shell脚本中显示具有最后日期(最高yyyy、最高mm、最高dd)的目录名 在此处添加文件名示例: p00_20131208 p00_20131220 p00_20140107 p01_20130324 试着这样做: find . -type d -name "p*" -exec ./process {} \; | sort > file
p00_20131208 p00_20131220 p00_20140107 p01_20130324
试着这样做:
find . -type d -name "p*" -exec ./process {} \; | sort > file
将以下文件保存为“进程”并运行“chmod+x进程”后
显然,您可以对文件进行不同的排序,并对其执行您喜欢的操作。此脚本将找到名称以6位数字结尾的每个目录,并将它们放入文件tmp中 在第二部分中,它从名称中提取日期(它获取最后6个字符,因此如果find start返回的文件夹具有像./or./subfolder/这样的相对路径,则不成问题) 最后,它将找到最新的日期,并用相应的名称打印文件夹
#!/bin/bash
find . -type d | egrep "p.._[0-9]{6}" > tmp
date=$(for r in $(cat tmp)
do
echo ${r: -6}
done | sort -nr | head -1)
cat tmp | grep $date
假设没有多个日期相同的目录:
#!/bin/bash
IFS=$'\n'
unset newestDir
for currDir in `ls -1f`
do
if [[ -d "$currDir" && "$currDir" =~ ^p.*_[0-9]{8}$ ]]; then
if [[ ! "$newestDir" ]]; then
newestDir=$currDir
else
newestDate=${newestDir:(-8)}
currDate=${currDir:(-8)}
if (( $currDate > $newestDate )); then
newestDir=$currDir
fi
fi
fi
done
echo $newestDir
我有一个目录,有很多文件和目录
看起来您只想在一个目录中执行此操作,然后执行以下操作:
cd /my/directory
p1='p*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
printf "%s\n" $p1|sort -t_ -nk2|head -1
您能提供这些目录的一些示例吗?p00_20131208 p00_20131220 p00_20140107 p01_20130324I将您的命令与用户Daniele建议的排序命令一起使用,最后的命令是:ls-dtr p**[0-9][0-9][0-9][0-9][0-9][0-9]| sort-n | tail-1因为只有你自己给了我最后修改的时间戳不是最后一个有最后日期的时间戳,而是谢谢!实际上,您不需要在这里排序,因为我使用的是已经进行排序的
ls-tr
。让我解释一下情况:假设我在这里有五个文件夹:p00-20130203 p00-20130403 p00-20130503 p00-20140203 gwmposd\ap让我们假设在执行您的命令之前,例如,我修改了其中一个文件夹p00-20130403的内容。执行您的命令不会给出我要查找的结果p00-20140203,但会给出最后修改的结果p00-20130403。这就是你需要排序的原因。好的,我明白了,在这种情况下可以添加排序,但是find是多余的,因为我们只处理单个目录。用更强大的方法检查更新后的答案,以找到具有给定模式的最新目录。我使用了你在这里建议的排序方法和一个提取日期的命令,它成功了:最后的命令是:ls-dtrp00[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]| sort-n | tail-1谢谢
cd /my/directory
p1='p*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
printf "%s\n" $p1|sort -t_ -nk2|head -1
find . -type d -name 'p??_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' |
sort -t _ -k2nr |
head -1