これは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
を使用するよりもシェルグロブを使用することを好みます。
xargs -0
は\ _で区切られた入力(find -print0
など)に使用することを目的としていますが、ls
にはこのように出力を区切るオプションはありません。
しかしながら、
ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename
途中で改行をnullに変換するトリックを実行します。これにより、xargsはスペースを含む名前を処理できます。
編集:-n 1
をxargsに追加
私はこれを使います:
ls | tr '\n' '\n'
次のようなリストが表示されます。
file1.mp3
file2.mp3
file3.mp3
...
ls -1 <path> | sed 's#.*/##'
awk
ソリューション:
ls -1 /path/glob | awk -F'/' '{print $NF}'
GNUベース名 と FreeBSDベース名 はどちらも-a
引数を受け入れ、コマンドに複数のパスを渡すことができます。これはシェルのグロビングとうまく機能します。
basename -a /path/glob*
ls [オプションのパス] | xargs -0ベース名
あなたは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'