回答:
これはの仕事のように聞こえfind
ます。
-maxdepth
現在のディレクトリのみを返すために使用し、サブフォルダ内を再帰的に検索しない-type f
ファイルのみを返すために使用し、ディレクトリやデバイスノードなどは返しません。-not
して-name
、あなたがしたくない名前のファイルを避けるために、次のようにまとめられるかもしれません。
find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
-exec ls -lG -- {} +
は、lsの追加オプションを使用して出力を取得するために彼の答えで使用することに言及しました。-ls
このfindにを追加して、lsの詳細ビューをすばやく簡単に近似することもできます。
GNU ls(つまり、非組み込みLinuxシステムとCygwinのlsコマンド、他の一部のUNIXでも使用可能)には、名前に基づいて一部のファイルを非表示にするオプションがあります。ただし、ディレクトリを無視する方法はありません。
ls --hide='t_*' uploads
別のアプローチは、シェルにマッチングを行わせることです。Bash、ksh、およびzshには、!(t_*)
一致するものを除くすべてのファイルに一致する否定パターンがありますt*
。bashではこの機能をオンにshopt -s extglob
する必要があり、zshではでオンにする必要がありますsetopt ksh_glob
。Zshには、^t_*
で有効にする必要がある同等の構文もありますsetopt extended_glob
。これはまだディレクトリを無視しません。Zshには、名前だけでなくメタデータなどでファイルを照合できる特別な機能があります:glob修飾子。(.)
一致の最後に追加して、通常のファイルに制限します。否定^
は、名前一致構文の一部であるため、^t_*(.)
「すべての通常ファイルが一致t_*
しない」および「一致する通常ファイルではないすべてのファイル」ではないことを意味しますt_*
。
setopt extended_glob # put this in your ~/.zshrc
ls uploads/^t_*(.)
高度なツールを使用していない場合は、Unixでこれを行うことができますfind
。通常、コマンドラインで入力するようなものではありませんが、強力で正確です。CalebはすでにGNU findでこれを行う方法を示しています。この-maxdepth
オプションは移植性がありません。-prune
代わりに、find
再帰的に移植を停止するために使用できます。
find uploads/* -type d -prune -o \! -type f -name 't_*' -print
ファイルのお気に入りのオプションで実行するには、-print
by -exec ls -lG -- {} +
に置き換えls
ます。
上記のすべてのコマンドは、ドットファイル(つまり、名前がで始まるファイル)を非表示にします.
。それらを表示する場合は、にパス-A
するls
かD
、zsh(ls uploads/^t_*(.D)
)にglob修飾子を追加します。ではfind
、あなたが作るの異なるアプローチを使用することができ、それが唯一のレベルを再帰的(find
特別扱いませドットファイルを行います)。これfind
は、現在のディレクトリで実行する場合にのみ完全に機能します。
cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print
-maxdepth
はずですが、Gillesが言う「移植性」の問題は、BSD find
(OSXにもあると思います)が少し違う動物なので、彼の答えも必要かもしれません。@Gilles:zshトリックの+1!
prune
s についてそれほどジューシーではないコメントが思い浮かびますが、自分のシステムをいじくり回しているときに、「このコマンドがAIX、Solaris、またはMINIX3」は、およそ...スタンバイ...メーターの読み取りが困難です...で表示がフリーズし0.00
ます。
ls
には--use-telepathy
オプションがありませんか?これは、必要なファイルだけを表示する最も簡単な方法です。ただし、ポータブルではない場合があります。
ls -l | grep -v ^d | grep name$
find
何ですか?
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}'
さらに短く明確な方法です。
私が間違っている場合、誰かが私を修正してください。:-)
ls
は一般に良いアイデアではありません。たとえば、ファイル名に空白文字が含まれていると、awkのトリックは失敗します。
このエイリアスを試して使用してください:
alias l='ls -hLlF'
ls -hLlF
はサブディレクトリを表示し、で始まるファイルを表示しますt_
。では、これは質問にどのように答えますか?