同じ名前のインクルードファイルの最後の変更日時に基づいてディレクトリを並べ替える

同じ名前のインクルードファイルの最後の変更日時に基づいてディレクトリを並べ替える

grepなどを使用して、find同じ名前(たとえば)を持つファイルの最後の変更日に基づいてディレクトリ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)

答え1

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

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||'

これは一般的な代替品ですが、区切り文字として使用されます。s/old_string/replacement_string/sed|old_string/空のaが含まれています。replacement_string。 (つまり、出力からファイル名と/その前にあるものを削除します)/file.phpls/sed 's|file.php||'sed 's/file.php//'

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

これにより、次のディレクトリが表示されます。存在する現在のディレクトリ、そしてそのディレクトリだけ。 (これは質問が要求するようです。)他のディレクトリの単一レベルの検索はマイナーな変更です。

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

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

shopt -s globstar

次に、*上記のコマンドのいずれかでアスタリスク()を2つのアスタリスク(**)に置き換えます。たとえば、次のようになります。

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

答え2

はい、可能です。

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

$ find /domain -type f -mmin -60

または、変更時間でソートされたファイルを提供します。

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

編集#1

ファイル拡張子が「.php」の場合は、以下を追加してください。

-name '*.php'

私が見つけたこれ確認してみるとよさそうです。

編集#2

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

答え3

これは、ディレクトリ名に続く/を省略することを除いて、必要なものとほぼ正確に一致します。

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

クレジットが必要なクレジット。これは以下で適応された。シェルク回答ここ

編集:私の%Aはすべて%Tでなければなりません。

答え4

そしてzsh

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

.om選択したファイルを並べmtime替え、:h末尾のパス部分を削除します。 sも
リストするには、mtime次のものを使用できます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}

関連情報