web-dev-qa-db-ja.com

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

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

このような:

.  ..  .bash_history  .ssh  updater_error_log.txt

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

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
181
fixxxer

次のように、-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
349
Bert F

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

ls -a | cat

説明:コマンドlsは、出力が端末、ファイル、またはパイプのいずれであるかを検出し、それに応じて調整します。

したがって、ls -aをpythonにパイプすると、特別な措置を講じなくても動作するはずです。

118
Peter G.

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つのファイル名を出力します。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、おそらく他のいくつかのユニックスですが、間違いなくWindowsではありません)では、別のアプローチは sshfs でsshを介してリモートファイルシステムをマウントし、ローカルで動作することです。

28
Gilles

ls -1を使用できます

ls -lも作業を行います

10
ILF

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

find . -maxdepth 1

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

find . -maxdepth 1 -print0

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

1
8bittree