たとえば、/ etc /ディレクトリに拡張子がなく、拡張子があるファイルがあります。
/etc/profile
/etc/profile.1
/etc/profile.2
そして、システムにはいくつかのファイルを含むディレクトリがあります。
/etc/profile.d/file1
/etc/profile.d/file2
/etc/profile.d/file3
スクリプトでlsを指定してすべてのprofile *ファイルを一覧表示しますが、私のファイルと同じ名前のディレクトリ内のファイルを一覧表示しないようにします。
「/etc/profile.d/」というディレクトリ名がリストされているかどうかは重要ではありませんが、そのディレクトリの下のファイルはリストされてはいけません。
私の風は、マニュアルページによると、「-R」オプションが指定されている場合にのみlsが再帰的に機能することです。
ソート機能とlsが変更、アクセス、作成時間などを表示できるため、lsを使用したいと思います。
通常、次のコマンドを使用します。
ls -la --time-style=long-iso /etc/profile*
ただし、私のファイルのみを表示する代わりに、lsは/etc/profile.dディレクトリに移動してそのディレクトリのファイルを一覧表示します。
私はこの例で与えられた名前だけでなく、一般的な解決策にも興味があります。
挨拶
答え1
それがls
ディレクトリの内容l
です。s
渡されたファイルがディレクトリでない場合は、そのファイルが一覧表示されます。このタイプのファイルの動作を取得するには目次もう一度オプションを渡す必要があります。-d
この場合、内容ではなくディレクトリファイル自体が一覧表示されます。
ls -l -d --time-style=long-iso /etc/profile*
-a
ディレクトリの内容をリストするときだけ関連があるので削除しました(グローブ拡張後にシェルによってリストが渡されるls
ディレクトリ自体ではない)。ls
ls
上記はファイルリストを作成しませんが、/etc/profile*
ファイルリストと一致するシェルに拡張されることを認識することが重要です。
-d
グローバル拡張子をls
。
を使用している場合は、組み込み関数を使用してファイルからメタデータを取得zsh
できます。stat
$ zmodload zsh/stat
$ stat -LF %FT%T.%N%z +mtime /etc/profile*
/etc/profile 2021-04-10T21:00:00.000000000+0100
/etc/profile.d 2022-09-22T17:26:49.109271759+0100
(ここでは明示的な日付形式が使用されます)
出力と同様に、ls
改行文字を含むファイル名はまだ処理できません。ただし、結果を表示するのではなく、配列に保存できます。
stat -nA mtimes -LF %FT%T.%N%z +mtime /etc/profile*
その後、繰り返します。
for file mtime ($mtimes) print -r -- ${(q+)file} was last modified on $mtime
または
printf '%q was last modified on %s\n' $mtimes
または、ファイルごとに1つずつ呼び出して、stat
結果を連想配列に入れます。たとえば、次のようになります。
for file (/etc/profile*)
stat -LH s -F %FT%T.%N%z -- $file &&
print -r -- $file, $s[size] bytes big was last modified on $s[mtime]
答え2
どうですかfind
?
find /etc -maxdepth 1 -name "profile*" -type f