我有一堆目录,其中包含相同c ++项目的不同修订版。我想整理一下将每个目录移动到由YYYY.MM.DD
模式命名的父目录。其中YYYY.MM.DD
是目录中最新条目(文件或目录)的日期。
如何以递归方式查找特定目录中最新条目的日期?
以下是其中一种方法:
find . -not -type d -printf "%T+ %p\n" | sort -n | tail -1
甚至:
find . -not -type d -printf "%TY.%Tm.%Td\n" | sort -n | tail -1
答案 0 :(得分:1)
尝试使用ls -t|head -n 1
列出按修改日期排序的文件,并仅显示第一个文件。日期将采用您的语言环境定义的格式(即YYYY-MM-DD)。
例如,
ls -tl | awk '{date=$6; file=$8; system("mkdir " date); system("mv $8 " " date"/")'
将遍历所有文件并为每个修改数据创建一个目录并将文件移动到那里(注意:必须注意包含空格的文件名)。现在在源树的根目录中使用find -type d
以递归方式列出所有目录。结合以上你现在(遗憾的是现在有一些开销):
for dir in $(find -type d) ; do export dir ls -tl dir| awk '{dir=ENVIRON["dir"]; date=$6; file=$8; system("mkdir " dir "/" date); system("mv " dir "/" $8 " " dir "/" date"/")' done
这不是递归地通过树,而是获取完整树的所有目录,然后迭代它们。如果您需要源树之外的日期目录(假设如此),则只需在awk脚本中编辑两个system()调用。
已编辑:修改脚本,添加更多说明
答案 1 :(得分:1)
另一种选择,将您的解决方案与之前的答案混合在一起:
find -print0 | xargs --null ls -dtl
它也显示了目录。