Linuxで出力行ごとに1つのファイル名をリストするにはどうすればよいですか?


229

ls -aコマンドを使用してディレクトリ内のファイル名を取得していますが、出力は1行です。

このような:

.  ..  .bash_history  .ssh  updater_error_log.txt

次のように、ファイル名を新しい行に取得するための組み込みの代替手段が必要です。

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

3
lsは、人間による消費のリストを表示することを目的としています。lsを他の目的で使用している場合(たとえば、スクリプト内のファイルのリストを取得して反復するなど)は、間違いなく間違ったツールを使用しています。
Juliano

2
@juliano-実際にはpythonスクリプトによって消費されます。なぜそれを間違ったツールと呼ぶのですか?
fixxxer

1
@fixxerパイプlsでpythonに渡すlsと、答えで説明したように、1行に1つのファイルが出力されます。
Peter G.

6
@fixxxer:それで、あなたは確かにそれを間違って使用しています。ユーザー端末での出力用にリストをフォーマットします。ファイル名の特殊文字を置き換えたり、特殊な意味を持つ文字を省略したりする場合があります。つまり、ls はユーザーにリストをフォーマットします。未フォーマットのファイル名が必要です。Python 'glob'モジュールを使用していない特別な理由はありますか?docs.python.org/library/glob.html「fnmatch」、「dircache 」などもあります。
ジュリアーノ

@fixxer Pythonで実際lsに出力しpythonて単一行の出力を確認しましたか?
Peter G.

回答:


430

次のように-1オプションを使用します(これは小文字の「L」ではなく「1」の数字です)。

ls -1a

ただし、最初に、lsサポートを確認してください-1。GNU coreutils(標準のLinuxシステムにインストールされています)とSolarisにはあります。疑問がある場合は、使用しman lsたりls --helpまたはマニュアルを参照してください。例えば:

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

2
+1私は知らなかった-1(-lはい(1つではない))マンページに表示されていますが、ずっとellとして読んでいました:)
slashmais

@slashmais-ああ、良い点-間違いやすい。私は答えを明らかにしました。
Bert F

1
@dty:GNUの場合、ls --help出力に文書化されます...常にインストールされます;-)
Tony Delroy

3
Googleで検索したところlinux ls one file per line、これがトップ記事でした。選択した回答がどれほど冗長であるか、またはこの回答の投票数がcatにパイプする回答よりも少ないとは信じられません。ls -1ftw。
crantok 2013年

3
lsデフォルトで-1は、出力が端末に接続されていないときの動作になります。
codeforester 2018

132

はい、簡単にls1行に1つのファイル名を出力できます。

ls -a | cat

説明:コマンドlsは、出力が端末へのものか、ファイルまたはパイプへのものかを感知し、それに応じて調整します。

そのため、ls -aPythonにパイプすると、特別な対策を講じなくても機能するはずです。


2
うわー、これは素晴らしいです。受け入れられた答えに対する利点-これは実際にはAndroid / adbシェルで動作します- lsいくつかの-1
簡略

ただし、出力に「ファイル」...「ファイル」が表示されないようにするにはどうすればよいですか。
マタンスター

@matanster:場合によっては、ドットファイルをすべて表示しますか?そうでない場合は、-aオプションを削除してください。
Peter G.

29

Lsは人間が使用するように設計されており、その出力を解析しないください

シェルスクリプトでは、lsの出力の解析が機能するいくつかのケースが、目的の効果を達成する最も簡単な方法です。lsはファイル名の非ASCII文字と制御文字を壊す可能性があるため、これらのケースはからファイル名を取得する必要のないケースのサブセットですls

Pythonでは、呼び出す理由はまったくありませんls。Pythonには、のすべてlsの機能が組み込まれています。使用するos.listdirディレクトリの内容を一覧表示したり、os.statまたはosファイルのメタデータを取得します。osモジュールの他の機能も、問題に関連している可能性があります。


sshを介してリモートファイルにアクセスしている場合、ファイル名を一覧表示するかなり堅牢な方法はsftpを使用することです。

echo ls -1 | sftp remote-site:dir

これは1行に1つのファイル名を印刷し、lsユーティリティとは異なり、sftp印刷できない文字を壊しません。それでも、ファイル名に改行が含まれているディレクトリを確実に一覧表示することはできませんが、めったに行われません(これは潜在的なセキュリティの問題であり、使いやすさの問題ではないことに注意してください)。

Pythonでは(シェルのメタ文字はでエスケープする必要があることに注意してくださいremote_dir):

command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")

より複雑な相互作用については、ドキュメントでsftpのバッチモードを検索してください。

一部のシステム(Linux、Mac OS X、おそらく他のunicesですが、間違いなくWindowsではありません)では、sshfsを使用してssh経由でリモートファイルシステムをマウントし、ローカルで作業するという別のアプローチがあります。


SSH経由でリモートマシンに接続しています。リモートマシンでos.listdirのようなpython関数を1行で実行する方法が見つかりませんでした。したがって、この質問。ファイルを一覧表示するだけのスクリプトを記述したくありません。この問題を回避する方法は他にありますか?
fixxxer

@fixxxer:sshは状況を変更します。これは、元の質問で言及すべきだった種類のことです。sftpはあなたのユースケースに適していると思います。
Gilles「SO-邪悪なことをやめよ」

混乱してごめんなさい。「command_line」にもパスワードを挿入できる方法はありますか?
fixxxerの

@fixxxer:わかりません、sshの作成者はプレーンテキストで保存されたパスワードを嫌い、これを簡単にしない傾向があります。鍵ベースの認証を実際にセットアップする必要があります(Webにはたくさんのチュートリアルがあり、これについてはsuperuser.comに質問があります)。
Gilles「SO-邪悪なこと

11

あなたは使うことができます ls -1

ls -l 仕事もします


一番上の答えはあなたが言った正確なことをすでに述べています。また、質問には具体的にはls -l使用しないでください。
DevX

2

ファイル名に改行が含まれていない限り、簡単です。

find . -maxdepth 1

これを別のコマンドにパイピングしている場合、ファイル名にnullバイトが発生することはないため、改行ではなくnullバイトでファイル名を区切ることをお勧めします(ただし改行は可能です)。

find . -maxdepth 1 -print0

通常、nullバイトは印刷されないため、端末で印刷すると、おそらく1行で表示されます。一部のプログラムは、次のようなハンドルヌル区切り入力に特定のオプションが必要な場合がありますsort-z。独自のスクリプトも同様にこれを考慮する必要があります。

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