lsがサブディレクトリにファイルを繰り返しリストするのを防ぐ方法

lsがサブディレクトリにファイルを繰り返しリストするのを防ぐ方法

たとえば、/ 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ディレクトリに移動してそのディレクトリのファイルを一覧表示します。

私はこの例で与えられた名前だけでなく、一般的な解決策にも興味があります。

挨拶

[Eメール保護]

ベストアンサー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]

おすすめ記事