从具有混乱文件名的文件路径名列表中查找最新文件版本

时间:2013-06-26 19:01:37

标签: eclipse bash grep

我最近在意外复制/替换困境中丢失了一堆来自eclipse的文件。我能够恢复其中的大多数,但我在eclipse元数据文件夹中找到了文件的历史记录,其中一些是我需要的。历史的路径是:

($WORKSPACE/.metadata/.plugins/org.eclipse.core.resources/.history). 

里面有一堆文件夹,如3e,2f,1a,ff等。每个文件夹都有一些名为“2054f7f9a0d30012175be7013ca49f5b”的文件。我能够用一个我知道会在文件中的关键字做一个递归grep并返回一个文件名列表(grep -R -l'KEYWORD'),现在我无法弄清楚如何对它们进行排序修改。

任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:1)

你可以尝试:

find $WORK.../.history -type f -printf '%T@\t%p\n' | sort -nr | cut -f2- | xargs grep 'your_pattern'

分解的:

  • find查找所有普通文件并打印其修改时间和路径
  • 排序sort以数字方式对它们进行排序 - 反向排序,因此最高数字排在第一位(最新修改后的数字)
  • cut从每行中删除时间
  • xargs为每个文件运行其参数输入,
  • 在这种情况下,
  • 将运行grep命令,所以
  • grep找到的第一个文件 - 是最新修改的

当文件名包含空格时,上述内容无效,但希望情况并非如此...... -printf仅适用于GNU find

对于重复性工作,您可以将命令分为两部分:

find $WORK.../.history -type f -printf '%T@\t%p\n' | sort -nr | cut -f2- > /somewhere/FILENAMES_SORTED_BY_MODIF_TIME

因此,在第1步中,您将文件名列表按其修改时间排序,然后可以在其内容上重复使用grep命令:

< /somewhere/FILENAMES_SORTED_BY_MODIF_TIME xargs grep 'your_pattern'

上述命令通常写为

xargs grep 'your_pattern' < /somewhere/FILENAMES_SORTED_BY_MODIF_TIME 

但是对于bash,可以将重定向写入开头,在这种情况下,如果模式位于最后一位,则更简单地更改pattern的{​​{1}} ...

如果要检查具有修改时间的文件名列表,可以将上述命令分解为:

grep

检查列表(它们现在也包含可读日期)并使用下一个

find $WORK.../.history -type f -printf "%T@\t%Tc\t%p\n" | sort -nr >/somewehre/FILENAMES_WITH_DATE

请注意,现在需要使用< /somewehre/FILENAMES_WITH_DATE cut -f3- | xargs grep 'your_pattern' 而不是第一个示例中的-f3-