ls -Alでファイル名(スペースを含む)のみを出力するにはどうすればよいですか?


79

この構成でファイルまたはディレクトリの名前のみをエコーする必要があります。

ls -Al | while read string
do
...
done

ls -Al 出力:

drwxr-xr-x  12 s162103  studs         12 march 28 12:49 personal domain
drwxr-xr-x   2 s162103  studs          3 march 28 22:32 public_html
drwxr-xr-x   7 s162103  studs          8 march 28 13:59 WebApplication1

たとえば、私が試してみると:

ls -Al | while read string
do
echo "$string" | awk '{print $9}
done

次に、スペースなしのファイルとディレクトリのみを出力します。ファイルまたはディレクトリに「パーソナルドメイン」などのスペースがある場合、「パーソナル」という単語のみになります。

非常にシンプルなソリューションが必要です。たぶん、awkよりも良い解決策があるでしょう。


2
どうしてls -Al *' '*lsの出力を解析しても、良い結果が得られることはありません。
マナトワーク

1
任意の* nixで機能するものが必要な場合は、の使用を避けてくださいls -Al | while。シンプルで信頼性の高い方法はfor string in *; do echo "$string"; doneです。
forcefsck

この構造でのみ必要です。大丈夫、単純ではなく、任意のソリューション!
アレックスザーン

1
なぜ必要 lsですか?解析lsと「すべて* nixで動作し、何かが起こっても壊れません」はうまくいきません。
テルドン

回答:


98

あなたは本当にの出力を解析するべきではありませんls。これが宿題であり、あなたが必要とされる場合、あなたの教授は彼らが何について話しているのか分からない。このようなことをしてみませんか:

いいもの...

find ./  -printf "%f\n"

または

for n in *; do printf '%s\n' "$n"; done

...悪い人...

本当に使用したい場合はls、次のようなことを行うことでもう少し堅牢にすることができます。

ls -lA | awk -F':[0-9]* ' '/:/{print $2}'

...そしてugい

あなたがそれを間違って危険な方法で行うことを主張し、whileループを使用する必要がある場合は、これを行います:

ls -Al | while IFS= read -r string; do echo "$string" | 
    awk -F':[0-9]* ' '/:/{print $2}'; done

でも真剣に、しないでください。


drwx------ 2 s162103 studs 3 oct. 9 2012 .ssh drwxr-xr-x 3 s162103 studs 6 oct. 25 09:02 .subversion drwxrwxrwt 3 s162103 studs 3 nov. 15 2012 .TempoItems時々私は時間のない日付を持っています、年とgawkだけが空に戻ります
アレックスザーン

1
@AlexZernさて、それがの出力を解析しない理由の1つですls
テルドン

2
@AlexZern -lとにかくスイッチが必要なのはなぜですか?ファイル名だけが必要な場合は、単に実行しls -Aます。使用-lすると、出力を解析する必要があるため、人生が難しくなります。
テルドン

アクセス、日付、所有者などの追加情報が必要だからです。そして、印刷ファイルとスペースを含むディレクトリ名を除き、うまく機能する巨大なスクリプトを書きました。
アレックスザーン

3
OK ここにあるのはXY問題です。ls必要なものを取得する最善の方法ではありません。収集したい情報を説明する新しい質問を投稿してみてください。その方法を提案できます。または、スクリプトをそのまま使用し、上記の提案のいずれかを使用して名前のみを印刷することもできます。しかし、真剣に、解析せずlsに、新しい質問であなたがやろうとしていることを正確に教えてください。
テルドン

74

ls -A1*が機能しない理由はありますか?

例えば:

$ touch file1 file2 file\ with\ spaces
$ ls -Al
total 0
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file1
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file2
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file with spaces
$ ls -A1
file1
file2
file with spaces
$

*注:大文字のAと1番目の数字です。


4
-1は天才です。私はそれが利用可能であることを知りませんでした。(私は知っている知っています。RTFM)
レイジーコーダー

〜/ projectsなどの他のディレクトリからファイル名をリストしたい場合、現在のディレクトリでのみ機能します。ファイル名の代わりにフルパスを取得します
-thecotne

Mac 10.9.5の@thecotneは、ファイル名をリストするだけです。どのOSを使用していますか?
AJP

。私は、これは私は名前だけを得るか-A1のls〜/プロジェクトのために〜/プロジェクト/ *崇高-プロジェクト-A1をLS実行しています
thecotne

3
@TheLazyCoderはマニュアルを読むことを期待されていません。
c24w

41

この単純なコマンドに誰も言及していないのはなぜだろうか。

ls -a | sort

2
ブリリアント!パイピングsortにより複数列ブロックが単一列にピボット解除される方法はありますか?
msciwoj

@msciwoj空白で区切られた任意の文字列を取得し、それらを終了行で区切ってソートして出力します
ベン

完璧!なぜこれが本当の答えとしてマークされなかったのですか!?
夏期劇場

3
出力が端末に送られない場合lsls -1(単一列出力)に戻るため、ここで機能します(印刷できない文字の引用/置換を無効にしますlsls出力はすでにソートされています。そのため、それをパイプするsortと、せいぜい何も行われず、さらに悪いことに、ファイル名に改行文字が含まれている場合は出力が破損するか、テキスト以外のファイル名では失敗します。ls -a | catのほうがいい。あるいはさらに良いls -A1既に述べたように(そして、あなたは一般的に交換をしたいですので、/端末上に表示されたときに引用)
ステファンChazelas

1
@StéphaneChazelas注目 ls出力が端末でない場合の動作は異なります。
クサラナナンダ

3

改行は、スペースはファイル名に含まれる文字と同じように有効な文字lsであるls -lため、もちろん、出力を解析することはできません。また、のような出力を持つシンボリックリンクを考慮する必要があります... foo -> bar

-lファイル名だけが必要なのに、とにかく使用するのはなぜですか?

ただやる:

for file in *; do
  ...
done

あなたは、ドットファイル(除く含める場合...:シェルに応じて)、

zsh

for file in *(ND); do
  ...
done

bash

shopt -s nullglob dotglob
for file in *; do
  ...
done

ksh93

FIGNORE='@(.|..)'
for file in ~(N)*; do
  ...
done

POSIXly:

for file in .[!.]* ..?* *; do
  [ -e "$file" ] || [ -L "$file" ] || continue
  ...
done


1
ls -Al | tr -s ' ' | cut -f9- -d' '

trを使用して複数のスペースを単一のスペースに圧縮してから、cutを使用してフィールドを分割できます


1

(試してみてくださいbashzshksh93構文):

find . -type f -print0 | while IFS= read -r -d '' filename; do
  ...
done

これは再帰的になり、通常のファイルにのみリストされます(つまり、dirsまたはsymlinks / fifos / devicesなし)。

こちらもご覧ください:



-1
ls --file *|grep ^ 

どのディレクトリの下にあるファイルを表示します。


これで問題が解決するとは思わない。
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.