`ls`にベースファイル名のみを印刷するように指示する


21

これはのデフォルトの動作です ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm

lsベース名のみを印刷するにはどうすればよいですか?お気に入り:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm

find/ net / nas / data / languages / pypm / sites / rex / freeには膨大な数のファイルとディレクトリが含まれているため、シェルを使用するよりもシェルグロブを使用する方が好きです。


1
ディレクトリに多数のファイルが含まれている場合にfindを使用してシェルグロビングを好むか。打ち間違え??
アキラ

1
私は、OPは、サブディレクトリのリストを望んでいないことを推測し、合格のオプションを認識していないんだ-maxdepth 1find
直感

回答:


19

一方でxargs -0\ 0(等によって区切られた入力に使用されることを意図しているfind -print0)、lsこのような方法で、その出力を区切るためにはそのようなオプションがありません。

しかしながら、

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

途中で改行をヌルに変換するトリックを実行します。これにより、xargsがスペースを含む名前で動作できるようになります。

編集:-n 1xargsに追加


これは私には機能しません:basename: extra operand \ 033 [0m / net / nas / data / languages / pypm / sites / rex / free / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0m'`
SRIDが復活モニカ言う

@Sridhar:-n 1他の場所で提案したものがオプションとして必要になるかもしれませんxargs。(回答の編集)
スティーブフォリー

個人的には(ファイル名のスペースを扱う必要がほとんどないので)自分の答えを好みますが、これもスペースを処理するための答えとしてマークします。
スリッドはモニカを

Macバージョンのxargsが-d(区切り文字)オプションをサポートしている場合は、できますls ... | xargs -d '\n' -n 1 basename
直観

12

私はこれを使用します:

ls | tr '\n' '\n'

次のようなリストが表示されます。

file1.mp3
file2.mp3
file3.mp3
...

3
これは、端末に書き込みを行っていない場合ls -1ls暗示するように、本質的に同じです(色付けは無効です)。問題はlsワイルドカードを使用してパス引数を指定するときにディレクトリ名を削除するため、少しポイントが抜けているようです。ls -d "$PWD/"* | tr '\n' '\n'実際の問題を確認してください。
ダニエルベック

-1 –なぜ人々がこの答えを支持し続けるのかわからない。ls -1Daniel Beckが指摘したように、それはと同じことを行うだけでなく、グロブが使用されたときにも機能しません。
slhck

-1-これはと同じでls -1、のようなパスではなく、現在のディレクトリでのみ機能しls path/*ます。
ブレンダンバード




2

GNU basenameFreeBSD basenameはどちらも-a引数を受け入れ、コマンドに複数のパスを渡すことができます。これは、シェルグロビングに最適です。

basename -a /path/glob*

1

あなたはでグロブすることを好むと言いましたがfind、この2つが相互に排他的ではないことを知っていましたか?グロビングは、実行するコマンドだけでなく、でも発生しますls。例えば:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

findの例では、パスに空白が含まれている場合に便利な-print0を使用できることに注意してください(tr他の場所で言及されている-basedソリューションは、通常のスペースではうまく機能しますが、実際の改行を含むファイルでは機能しません)。

最後に、GNU findにアクセスできる場合、baseprint呼び出しを完全に回避する-printfを使用することもできます。

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'

残念ながら、-printfMacOSXバージョンのではオプションは利用できませんfind
スリッドは、モニカを

良い電話; 監督の謝罪。答えを更新しました。
ライアンブライト

-3

すべてのファイルがあるディレクトリに移動して入力します。

find *.pypm

1
OPは使用したくないと明示的に宣言しましたfind
グロノスタジ

1
また、これはOPが必要とすることすら行いません。(注:使用する必要がfind . -name '*pypm'あるのは、... globを次に見つけるだけで何も達成できない場合-その後、単に書くことができますls *.pypm。)
slhck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.