変更日ごとにソートされたファイルを繰り返しリストする方法(statコマンドは使用できません!)

変更日ごとにソートされたファイルを繰り返しリストする方法(statコマンドは使用できません!)

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

find今私は、とを使用してstatこれを達成する方法を知っていますが、sort奇妙な理由でstatボックスにインストールされず、インストールしないでしょう。

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

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

答え1

私の最も短い方法はzshを使用します。

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

D隠しファイルや隠しディレクトリのファイルを一覧表示するには、glob修飾子を追加してください。)

GNU検索がある場合は、ファイルの修正時間を印刷してその時間で並べ替えます。ファイル名に改行文字がないとします。

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

答え2

GNUを仮定するとfind

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

最新のファイルが最初にリストされるようにするには、に1n,1変更します。1nr,1

GNUがないと、タイムスタンプ形式が非常に多様であるfindため、これはより困難になりますls(たとえば、最近変更されたファイルのタイムスタンプスタイルが異なります)。

答え3

Macには-printfパラメータが見つかりませんが、次のことができます。

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

答え4

通常、日付別にファイルを検索します。 (元のポスターでは動作しませんでしたが、ここまで来たので他の人にも機能すると思いました。)私のユースケースでは、削除する前に確認できるようにこれらのファイルを一覧表示したいと思います。

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削除コマンドを使用してリストの一部を簡単に変更できることです。

find . -type f -mtime +270 -delete

関連情報