web-dev-qa-db-ja.com

同じ名前の含まれているファイルの最終変更日時によるディレクトリの並べ替え

grepfindなどを使用して、同じ名前のファイルの最終変更日でディレクトリのリストを並べ替えることは可能ですか(例:file.php) 以内に?例えば:

domain1/file.php (last modified 20-Jan-2014 00:00)
domain2/file.php (last modified 22-Jan-2014 00:00)
domain3/file.php (last modified 24-Jan-2014 00:00)
domain4/file.php (last modified 23-Jan-2014 00:00)

各ディレクトリのファイル名は同じです(例:file.php)。

結果は次のようになります。

domain3/ (last modified 24-Jan-2014 00:00)
domain4/ (last modified 23-Jan-2014 00:00)
domain2/ (last modified 22-Jan-2014 00:00)
domain1/ (last modified 21-Jan-2014 00:00)
4
user88922

Vivianが提案したように、ls-tオプションは、変更時刻でファイルをソートするように指示します(デフォルトでは、最新のものが最初です。-rを追加すると逆になります)。これは(少なくとも私の経験では)ディレクトリ内のファイルを並べ替えるために最も一般的に使用されますが、コマンドラインのファイルのリストに適用することもできます。また、ワイルドカード(「グロブ」)は、コマンドラインでファイルのリストを生成します。だから、あなたが言うなら

ls -t */file.php

リストされます

domain3/file.php  domain4/file.php  domain2/file.php  domain1/file.php

ただし、-1(ダッシュ1)オプションを追加するか、これを何かにパイプすると、1行に1つずつ一覧表示されます。だからあなたが望むコマンドは

ls -t */file.php | sed 's|/file.php||'

これは、sedの通常のs/old_string/replacement_string/置換ですが、|old_stringが含まれているため、区切り文字として/を使用します。 、および空のreplacement_string。 (つまり、ファイル名とその前の//file.php —をls出力から削除します。)もちろん、ディレクトリの末尾に/が必要な場合は名前は、sed 's|file.php||'またはsed 's/file.php//'を実行してください。

必要に応じて、-l(小文字のL)オプションをlsに追加して、変更日時を含む長いリストを取得します。次に、sedコマンドを拡張して、関係のない情報(モード、所有者、ファイルのサイズなど)を取り除き、必要に応じて、ディレクトリ名の後に日付/時刻を移動することもできます。

これにより、現在のディレクトリinであるディレクトリが調べられ、それらだけが調べられます。 (これは質問が求めているもののようです。)他のディレクトリの1レベルのスキャンを実行することは、些細なバリエーションです。

ls -t /path/to/tld/*/file.php | sed 's|/file.php||'

現在のディレクトリ(または他の最上位ディレクトリ)の下にあるディレクトリツリー全体を(再帰的に)検索するには、少し注意が必要です。コマンドを入力します

shopt -s globstar

次に、上記のコマンドの1つにあるアスタリスク(*)を2つのアスタリスク(**)に置き換えます。例:

ls -t **/file.php | sed 's|/file.php||'

はい、それはかなり可能です。

これにより、過去60分間に変更されたファイルが提供されます。

$ find /domain -type f -mmin -60

または、これにより、変更時間でソートされたファイルが提供されます。

$ find /domain -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

編集#1

'.php'と言ったようなファイル拡張子がある場合は、次を追加します。

-name '*.php'

そして私は見つけました this あなたはそれを見たいかもしれません。

編集#2

さて、あなたの最後の編集は物事を難しくします。ただし、ls -tを使用して最後に変更されたディレクトリを指定できます。また、時間ls -clRtで並べ替える場合は、それを使用できます。その後、ファイルを確認できますが、どのファイルでも何が可能かわかりません。特定のコマンド。同様のスクリプト(BashまたはPerl)で可能です。

1
Vivian Maya

これは、ディレクトリ名の末尾/を省略していることを除いて、ほぼ正確に実行します。

find . -maxdepth 2 -name file1.php -printf '%T@ %h (last modified %Td/%Tm/%TY %Tk:%TM)\n' \
| sort -k 1n | sed 's/^[^ ]* .\///'

クレジットが必要な場合のクレジット。これは shlck's answer here から適応されます。

編集:私の%Aはすべて%Tである必要があります

1
Omnipresence

zshの場合:

setopt extendedglob
print -rl -- **/file.php(.om:h)

.omは選択したファイルをmtimeでソートし、:hは末尾のパスコンポーネントを削除します。
mtimesもリストしたい場合は、zstatを使用できます。

zmodload zsh/stat
for f (**/file.php(.om))
printf '%s %s\t%s\n' $(zstat -F '%d-%b-%Y %T' +mtime -- $f) ${f:h}
0
don_crissti