ls -a
コマンドを使用してディレクトリ内のファイル名を取得していますが、出力は1行です。
このような:
. .. .bash_history .ssh updater_error_log.txt
次のように、ファイル名を新しい行に取得するための組み込みの代替手段が必要です:
.
..
.bash_history
.ssh
updater_error_log.txt
次のように、-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
はい、ls
を1行に1つのファイル名で簡単に出力できます。
ls -a | cat
説明:コマンドls
は、出力が端末、ファイル、またはパイプのいずれであるかを検出し、それに応じて調整します。
したがって、ls -a
をpythonにパイプすると、特別な措置を講じなくても動作するはずです。
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を介してリモートファイルシステムをマウントし、ローカルで動作することです。
ls -1
を使用できます
ls -l
も作業を行います
ファイル名に改行が含まれていない限り、簡単です。
find . -maxdepth 1
これを別のコマンドにパイプする場合、ファイル名にヌルバイトを含めることはできないため、改行ではなくヌルバイトでファイル名を区切ることをお勧めします(ただし、改行は可能です)。
find . -maxdepth 1 -print0
通常、nullバイトは印刷されないため、端末で印刷すると1行で表示されます。 sort
の-z
など、一部のプログラムでは、ヌル区切りの入力を処理するための特定のオプションが必要になる場合があります。独自のスクリプトも同様にこれを説明する必要があります。