我有一个目录,该目录具有许多文件和目录,我想找到具有日期的名称格式的目录之一:
p ** _ yyyymmdd
我可以编写一个命令(通过名称而非时间戳),该命令显示在Shell脚本中具有最后日期的目录名称(最高Yyyy,然后是最高MM,然后是最高DD)?
在此处添加文件名示例:
p00_20131208 p00_20131220 p00_20140107 p01_20130324
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
我有一个目录,有许多文件和目录,
看起来您只想在一个目录中这样做,然后您要这样做:
cd /my/directory
p1='p*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
printf "%sn" $p1|sort -t_ -nk2|head -1
此脚本将找到每个名称以6位数字完成的目录,然后将它们放入文件tmp。
。在第二部分中,它从名称中提取日期(它获得了最后6个字符,因此,如果查找返回的文件夹以./或./或././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
尝试这样的东西:
find . -type d -name "p*" -exec ./process {} ; | sort > file
保存以下作为文件"过程"并运行" chmod x Process"
#!/bin/bash
p=$1
yyyymmdd=${p#*_} # Strip everything before underscore
y=${yyyymmdd:0:4} # Extract 4 chars for year
m=${yyyymmdd:4:2} # Extract 2 chars for month
d=${yyyymmdd:6:2} # Extract 2 chars for day
echo $y $m $d $p
显然,您可以以不同的方式对文件进行排序,然后按照自己的意愿进行操作。