web-dev-qa-db-ja.com

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

uploadsというディレクトリがあります。たくさんのファイルと、いくつかのサブディレクトリにファイルが含まれています。

私は(1つのステップで)次のことができる方法はありますか:

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

    および

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

-dフラグについては知っていますが、必要な機能が十分に得られません。

45
EmmyS

これはfindの仕事のようです。

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

それはこのように一緒になるかもしれません:

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

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には、名前だけでなくメタデータなども使用してファイルを照合できる追加機能があります: glob qualifiers 。一致の最後に_(.)_を追加して、通常のファイルに制限します。否定_^_は名前一致構文の一部であるため、^t_*(.)は「_t_*_に一致しないすべての通常のファイル」を意味し、「_t_*_に一致しないすべての通常のファイル」を意味しませんSOMECODE)__」。

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

高度なツールがない場合は、findを使用してUNIXでこれを実行できます。コマンドラインで通常入力するようなものではありませんが、強力で正確です。 Calebは、この方法を既に示していますGNU find 。_-maxdepth_オプションは移植性がありません。代わりに_-Prune_を使用できます。移植可能なfindの再帰を停止します。

_find uploads/* -type d -Prune -o \! -type f -name 't_*' -print
_

_-print_を_-exec ls -lG -- {} +_に置き換えて、lsをファイルの任意のオプションで実行します。

上記のすべてのコマンドは、ドットファイル(つまり、名前が_._で始まるファイル)を非表示にします。それらを表示するには、_-A_をlsに渡すか、Dグロブ修飾子をzshに追加します(ls uploads/^t_*(.D))。 findを使用すると、1レベルだけを再帰させる別のアプローチを使用できます(findはドットファイルを特別に扱いません)。これは、現在のディレクトリでfindを実行した場合にのみ完全に機能します。

_cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
_
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$

Findの-maxdepth移植性の問題が懸念される場合は、以下を使用できます。

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

私は専門家ではありませんが、これでうまくいくと思います。私はそれが少し不可解に見えると思いますが、もしあなたがawkを話すならば、それは本当にそうではありません。 $ 9の代わりに$ NFを使用できます。あなたも行うことができます:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

これは同じことを行います(ただし、おそらく前者より効率が悪いのでしょうか?)。

実は他の投稿を考えてみると

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

さらに短くて明確な方法です。

私が間違っている場合、誰かが私を訂正してください。 :-)

0
kkaszub

私はこれらの短い方法を見つけました:

ls -p uploads | grep -Ev '/'

または

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

lsとパイプを使用して試してみましょう:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

最後の列は9列目だと言ってください。

0
Y0NG