web-dev-qa-db-ja.com

`ls`にベースファイル名だけを出力するように伝えます

これは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

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

22

xargs -0は\ _で区切られた入力(find -print0など)に使用することを目的としていますが、lsにはこのように出力を区切るオプションはありません。

しかしながら、

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

途中で改行をnullに変換するトリックを実行します。これにより、xargsはスペースを含む名前を処理できます。

編集:-n 1をxargsに追加

19
Steve Folly

私はこれを使います:

ls | tr '\n' '\n'

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

file1.mp3
file2.mp3
file3.mp3
...
12
arrayown
ls -1 <path> | sed 's#.*/##'
5
mpez0

awkソリューション:

ls -1 /path/glob | awk -F'/' '{print $NF}'
4
Amnon

GNUベース名FreeBSDベース名 はどちらも-a引数を受け入れ、コマンドに複数のパスを渡すことができます。これはシェルのグロビングとうまく機能します。

basename -a /path/glob*
2
dcoles

ls [オプションのパス] | xargs -0ベース名

2
Glen Y.

あなたは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

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

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

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