uploads
というディレクトリがあります。たくさんのファイルと、いくつかのサブディレクトリにファイルが含まれています。
私は(1つのステップで)次のことができる方法はありますか:
ルートアップロードディレクトリ内のファイルのみを一覧表示します-サブフォルダー名やその内容を表示したくありません。
および
t_
で始まるファイルはリストしないでください
-d
フラグについては知っていますが、必要な機能が十分に得られません。
これはfind
の仕事のようです。
-maxdepth
を使用して、現在のディレクトリのみを返し、サブフォルダ内を再帰的に検索しない-type f
を使用すると、ファイルのみが返され、ディレクトリやデバイスノードなどは返されません。-not
と-name
の組み合わせを使用して、不要な名前のファイルを回避するそれはこのように一緒になるかもしれません:
find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
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}'
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}'
さらに短くて明確な方法です。
私が間違っている場合、誰かが私を訂正してください。 :-)
私はこれらの短い方法を見つけました:
ls -p uploads | grep -Ev '/'
または
ls -pIt_* uploads | grep -v /
ls
とパイプを使用して試してみましょう:
ls -l --hide='t_*' uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9
最後の列は9列目だと言ってください。