根据上次修改日期对目录中的文件进行递归排序


11

根据上次修改日期对目录中的文件进行递归排序

我在目录中修改了很多文件,想通过最后修改日期对文件进行排序,以了解这些文件是什么,并且我希望排除某些扩展名

在svn目录中,我也有很多.svn文件,这些文件我也不想显示


我演示了如何在答案中排除扩展名。
mikeserv

Answers:


18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

会给你类似的东西

2014-03-31 04:10:54.8596422640 ./foo
2014-04-01 01:02:11.9635521720 ./bar


我可以从文件夹中排除文件扩展名吗?...
Danny

@Danny是的,使用find:很容易find -not -iname '*.ext'
2014年

查找-not -path“ svn ” -not -name“ * svn” -printf“%TY-%Tm-%Td%TT%p \ n” | sort -n这正是我需要的,非常感谢@ n.st
Danny

5

如果要展平目录结构(因此按日期对所有目录中所有文件的日期进行排序,而忽略文件所在的目录),则可以使用find@yeti建议的-approach。如果要保留目录结构,可以尝试

$ ls -ltR /path/to/directory

根据目录排序。


1
这给我明智的文件夹,如我需要的是一起什么是最近修改的文件
丹尼

5

在bash中,shopt -s globstar先运行。在ksh93中,set -o globstar先运行。在zsh中,您已经设置好了。

ls -dltr **/*

如果文件太多以致超出了系统上的命令行长度限制,这将返回错误。在zsh中,可以改用以下命令:

print -rl -- **/*(Om)

这是唯一适用于Solaris 10的答案,谢谢!:)
laxxy

3

假设您正在使用GNU查找,请尝试:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

1
您可以使用find-printf选项来避免调用一个单独的进程(或多个,取决于文件数)。请参阅我的答案作为示例。
2014年

1
知道还有其他方法可以做,所以我stat个机会展示一下-exec ... +。真!有时候我认为,stat应该引起更多的关注...而且任何人都应该在不阅读成分和后果的情况下从这里拿食谱...

顺便说一句...不是每个发现都有-printf...

1
@yeti-如果您find没有-printf 可以使用-exec sh -c 'printf...'来获得很多相同的功能。这也将包括访问$(pwd)完全限定的路径。
mikeserv 2014年

2
我遇到了很多Linux用户,他们从未听说过stat。所以有时候我只想把注意力集中在stat... 上,我认为stat应该得到它...

2

要仅使用最新的GNU工具可靠地列出文件名:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'

2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

这样可以避免任何参数列表问题,因为唯一ls会收到的参数是您要列出的目录的名称。您可以使用任何您喜欢的方法进行操作。

外壳只是. sources|pipe为一个shell脚本-这是相同的过程,并没有时,你可以遇到的问题execve被调用。

在任何情况下-上面的内容只有三级,可以通过更改进行调整maxdepth 它也首先深入-因此您可以从逐步返回当前目录depth

您可能会注意到,您也得到了$LSCOLORS-在我的机器上,它还提供了整齐打印的列以及您想要的其他所有内容ls-或就此而言,您可以想象得到的任何内容. source.

没有SVN

同样,这将完成您期望做的任何事情ls因此,隐藏.svn文件就像将ls行更改为:

ls -t --color=always --hide="*svn" "%p"\n

或者,如果您想svn在每个文件夹中查看扩展名,则./svn可以对其进行更改,以使整个命令如下所示:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

就我个人而言,我喜欢ls,-s并且,如果您愿意,-u它将按访问时间而不是mod时间进行排序。


1

此清单将列出所有清单files<dir>其中最旧的是最旧的

find <dir> -type f -print0 | xargs -0 ls -ltr

而最新的修改是最重要的

find <dir> -type f -print0 | xargs -0 ls -lt

请注意,这仅在文件名列表未超过系统上命令行总长度限制的情况下才有效。


没错,我忘了这
件事

有关命令的 参考:arg list in-ulm.de/~mascheck/various/argmax
UnX 2014年

@吉尔斯:你的意思是xargs -0(在两种情况下)。  xargs -print0等于xargs -p -r -i -n -t -0xargs -inprt0xargs -0ntrip,这可能不是您的意思。
斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.