最終更新日に基づいてディレクトリ内のファイルを再帰的にソートします


11

最終更新日に基づいてディレクトリ内のファイルを再帰的にソートします

私は自分のディレクトリ内の多くのファイルを変更しましたが、それらのファイルが最後に変更された日付で並べ替えることによってそれらのファイルが何であるかを知りたいので、一部の拡張機能を除外します

svnディレクトリには、ソートに表示したくない.svnファイルもたくさんあります


私は私の拡張子を拡張から除外する方法をデモします。
mikeserv 2014

回答:


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 -not -iname '*.ext'
n.st 2014

find -not -path " svn " -not -name "* svn" -printf "%TY-%Tm-%Td%TT%p \ n" | sort -nこれはまさにn @ stのおかげで私が必要としていたものです
Danny

5

ディレクトリ構造をフラットにしたい場合は(つまり、すべてのディレクトリ内のすべてのファイルで日付順にソートし、ファイルが含まれているディレクトリは無視します)、find@ yetiによって提案された-アプローチが適しています。ディレクトリ構造を維持したい場合は、

$ ls -ltR /path/to/directory

これは、ディレクトリに基づいてソートします。


1
これにより、フォルダーが賢くなります。必要なのはすべて一緒になっていて、最近変更されたファイルは何
Danny

5

bashでは、shopt -s globstar最初に実行します。ksh93で、set -o globstar最初に実行します。zshでは、すでに設定されています。

ls -dltr **/*

システムのコマンドラインの長さの制限を超えるほど多くのファイルがある場合、これはエラーを返します。zshでは、代わりにこれを使用できます。

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

これが、Solaris 10で機能する唯一の回答です。ありがとうございます。:)
laxxy 2016

3

あなたがGNU findを使用していると仮定して、試してください:

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

1
find-printfオプションを使用すると、個別のプロセス(またはファイルの数に応じて複数のプロセス)の呼び出しを回避できます。例については、私の回答を参照しください。
n.st 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|pipeexecve

いずれの場合でも、上記は3つの深さしかありません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リストが長すぎるin-ulm.de/~mascheck/various/argmax
UnX

@ギレス:あなたはxargs -0(どちらの場合も)意味します。  orまたはor にxargs -print0相当しますが、これはおそらく意図したものではありません。xargs -p -r -i -n -t -0xargs -inprt0xargs -0ntrip
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.