ディレクトリなしでファイルを一覧表示して名前でフィルタリングする方法(lsオプション)

ディレクトリなしでファイルを一覧表示して名前でフィルタリングする方法(lsオプション)

というディレクトリがありますuploads。これには、複数のファイルとファイルを含むいくつかのサブディレクトリが含まれています。

次の手順を1つの手順で実行する方法はありますか?

  1. ルートアップロードディレクトリにあるファイルのみを一覧表示します。サブフォルダ名やその内容を見たくありません。

    そして

  2. 次に始まるファイルをリストしないでください。t_

私は-dその旗を理解していますが、私が望むものを手に入れることはできません。

答え1

これは職業のように聞こえますねfind

  • -maxdepthサブフォルダ内で再帰的に検索するのではなく、現在のディレクトリのみを返すために使用されます。
  • -type fディレクトリやデバイスノードやその他のエントリではないファイルのみを返すために使用されます。
  • -not-name不要な名前のファイルを避けるには、ifと組み合わせを使用してください。

次のように組み合わせることができます。

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'

答え2

GNU ls(つまり、組み込まれていないLinuxシステムとCygwinのlsコマンドと他の一部のunicesでも利用可能)には、名前に基づいて特定のファイルを隠すオプションがあります。ただし、ディレクトリを無視する方法はありません。

ls --hide='t_*' uploads

もう一つの方法は、シェルが一致するようにすることです。 Bash、ksh、およびzshには、!(t_*)一致するファイルを除くすべてのファイルと一致するネガティブパターンがありますt*。 bashではこの機能を有効にしshopt -s extglob、zshではこの機能を有効にする必要がありますsetopt ksh_glob。 Zshには、^t_*使用する必要がある同等の構文もありますsetopt extended_glob。これはまだディレクトリを無視しません。 Zshには、名前だけでなくメタデータなどに基づいてファイルを一致させる追加機能があります。グローバル予選(.)通常のファイルに制限するには、一致が終わったら追加してください。否定は^名前一致構文の一部であるため、^t_*(.)「一般ファイルと一致しないすべてのファイル」t_*ではなく、「一致しないすべての一般ファイルt_*」を意味します。

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

高度なツールがない場合は、実行できますfindCalebはGNU findを使ってこれを行う方法を示しました。。このオプションは移植可能ではありません。移植可能に再帰を停止するために-maxdepth使用できます。-prunefind

find uploads/* -type d -prune -o \! -type f -name 't_*' -print

-printファイルで-exec ls -lG -- {} +必要なオプションを実行するには、に置き換えます。ls

上記のすべてのコマンドは、ドットファイル(名前で始まるファイルなど.)を隠します。これを表示するには、に渡すか、-Azsh()にlsglob修飾子を追加してください。を使用すると、別の方法を使用して1つのレベルのみを再帰的に作成できます(ドットファイルを特に処理しません)。これは、現在ディレクトリで実行されている場合にのみ完全に機能します。Dls uploads/^t_*(.D)findfindfind

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print

答え3

ls -l /folder | grep ^- | awk '{print $9}'

答え4

私は次のような短い方法を見つけました。

ls -p uploads | grep -Ev '/'

または

ls -pIt_* uploads | grep -v /

関連情報