web-dev-qa-db-ja.com

変更日付でソートされたファイルを再帰的に一覧表示する方法(statコマンドは使用不可!)

現在のディレクトリの下にあるすべてのファイルのリストを、それらの変更日とともに取得し、その日付でソートするにはどうすればよいですか?

findstat、およびsortを使用してこれを実現する方法を知っていますが、奇妙な理由により、statがボックスにインストールされておらず、インストールできます。

他のオプションはありますか?

PS:gccもインストールされていません

31
alex

私の最短の方法はzshを使用します:

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

(隠しファイルまたは隠しディレクトリ内のファイルも一覧表示する場合は、D glob修飾子を追加します)。

GNU findがある場合は、ファイルの変更時刻を出力し、それでソートします。ファイル名に改行がないと思います。

find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'

Perlを使用している場合(ここでも、ファイル名に改行がないと仮定しています):

find . -type f -print |
Perl -l -ne '
    $_{$_} = -M;  # store file age (mtime - now)
    END {
        $,="\n";
        print sort {$_{$b} <=> $_{$a}} keys %_;  # print by decreasing age
    }'

Python(ここでも、ファイル名に改行がないと仮定)がある場合:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'

そのサーバーにSSHアクセスできる場合は、より適切なマシンに sshfs を介してディレクトリをマウントします。

mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt

POSIXツールのみでは、ファイルの変更時刻を見つけるための良い方法がないため、はるかに複雑になります。ファイルの時間を取得する唯一の標準的な方法はlsで、出力形式はロケールに依存し、解析が困難です。

ファイルへの書き込みが可能で、通常のファイルのみに関心があり、ファイル名に改行がない場合、これは恐ろしいことです:単一のディレクトリ内のすべてのファイルへのハードリンクを作成し、変更時刻で並べ替えます。

set -ef                       # disable globbing
IFS='
'                             # split $(foo) only at newlines
set -- $(find . -type f)      # set positional arguments to the file names
mkdir links.tmp
cd links.tmp
i=0 list=
for f; do                     # hard link the files to links.tmp/0, links.tmp/1, …
  ln "../$f" $i
  i=$(($i+1))
done
set +f
for f in $(ls -t [0-9]*); do  # for each file, in reverse mtime order:
  eval 'list="${'$i'}         # prepend the file name to $list
$list"'
done
printf %s "$list"             # print the output
rm -f [0-9]*                  # clean up
cd ..
rmdir links.tmp

GNU find

find . -printf '%T@ %c %p\n' | sort -k 1n,1 -k 7 | cut -d' ' -f2-

変化する 1n,1から1nr,1最新のファイルを最初にリストする場合。

GNU findがない場合、lsのタイムスタンプの形式は非常に異なるため、最近変更されたファイルのタイムスタンプのスタイルが異なります。例)。

14
geekosaur

Macでは、検索する-printf引数はありませんが、代わりにこれを行うことができます。

find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'

7
killdash9

これを試すことができます(ただし、自分で作成する必要があります) https://github.com/shadkam/recentmost

0
user3392225

ファイルを日付で検索することについて一般的に言えば(これは元のポスターでは機能しませんが、私はここにたどり着いたので、他の人も同様だと思いました)。私の使用例では、削除する前にファイルを確認するためにファイルをリストしたいと思います。

Findutils 4.6.0を使用すると、次のようになります。

find . -type f -mtime +270 -exec ls -laFGht --time-style=iso {} \+

上記のコマンドは、現在の作業ディレクトリ(-type f)で270日以上前に変更されたファイル(.)を検索します(-mtime +270また、-mtime 0は最後の24時間、-mtime -5は過去5日間を示します)。次に、lsを使用して、日付順にリストします。新しいものが最初です(-exec ls -laFGht --time-style=iso {} \+

これは出力のサンプルです:

-rwxrwx---+ 1 user1 208M 2018-07-16  ./filename.bak*
-rwxrwx---+ 1 user1  702 2018-07-15  ./filename.ldf*
-rwxrwx---+ 1 user1 208M 2018-07-15  ./filename.bak*

これのすばらしい点は、リストが確認されたら、リストの部分をfind deleteコマンドに置き換えるだけの簡単なことです。

find . -type f -mtime +270 -delete
0
Steph

隠しファイルを無視—ナイス&高速タイムスタンプ

ファイル名のスペースをうまく処理します—それらを使用するべきではありません!

$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10

2017.01.25 18h23 Wed ./indenting/Shifting blocks visually.mht
2016.12.11 12h33 Sun ./tabs/Converting tabs to spaces.mht
2016.12.02 01h46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016.11.09 17h05 Wed ./Word count - Vim Tips Wiki.mht

More find galore はリンクをクリックすると見つかります。

0