質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

2回答

1002閲覧

zshでlsコマンドでファイルのみを表示したいです。

yuta.kamoi

総合スコア11

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

1クリップ

投稿2021/11/16 14:33

閲覧ありがとうございます。最近zshの勉強を始めたコマンドライン初学者です。
環境はwindows10、Windows Terminal、ubuntu-20.04、zsh、linuxbrewを使用しています。
補完関数にてとあるディレクトリのファイル一覧を表示したいのですが、うまくいきません。
以下のように記述したのですがなにか間違えているでしょうか。

zshrc

1function testcat() { 2 cat "/とあるディレクトリのパス/$1" 3} 4#compdef testcat 5function _testcat() { 6 _values \ 7 `ls -F /とあるディレクトリのパス/ | grep -v /` 8} 9compdef _testcat testcat

とあるディレクトリのパス内にファイル名に半角スペースが入っていた場合に表示されるファイル名がおかしくなってしまいます。
例として、とあるディレクトリのパス内に「a」「e c b」「d(ディレクトリ)」というファイルがあったとして、
補完時に「a 'e c b'」と表示したいです。しかし、上記のようにls -F /とあるディレクトリのパス/ | grep -v /を使うと、「a* b* c e」と表示されてしまいます。
スペースごとに区切られて別のファイルであるかのように表示され、また、ファイル名の末尾にアスタリスクが付いてしまい、また、補完から選択すると末尾にスラッシュが付いてしまいます。
補完のaを選択するとa/となってしまいます。

ちなみに関数とは関係なくただls -F /とあるディレクトリのパス/ | grep -v /を出力するとスペースごとに区切られることはなく

a*
e c b*
」と表示されます。しかし、なぜか改行され、アスタリスクは付いてしまいます。
ファイル名のみを表示する方法を調べてもls -F path | grep -v /以外の情報がなかなか見つからないのですがなにか解決策はないでしょうか。
wslを使用している環境上、どうしてもスペースが名前にはいったフォルダやファイルが多いため悩んでいます。
どうかご回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ls-F を付けるとディレクトリに /、実行ファイルに *、シンボリックリンクに @ などが付きます。

簡単にやるには、zsh の機能でファイルのみのリストを作るのがよいかもしれません。

sh

1setopt local_options 2setopt extended_glob 3_values /とあるディレクトリのパス/*(.:t:q)

. でファイルに限定、:t でディレクトリ名の削除、:q で空白のエスケープをします。

投稿2021/11/16 15:18

int32_t

総合スコア21927

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuta.kamoi

2021/11/17 12:21

前回の質問に続きご回答ありがとうございます!完璧にやりたかった通りの形になりました。 本当に助かりました。ご回答ありがとうございました。
guest

0

zshなら

zsh

1ls パス/*(.)

パス/a 'パス/e c b' の出力が得られます。

zsh

1ls -Q パス/*(.)

なら "パス/a" "パス/e c b" の出力が得られます。

投稿2021/11/16 15:00

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問