Linuxの出力ラインごとに1つのファイル名をリストするにはどうすればよいですか?
質問
私は使用しています ls -a
ディレクトリ内でファイル名を取得するコマンドですが、出力は単一の行にあります。
このような:
. .. .bash_history .ssh updater_error_log.txt
ファイル名を取得するために、組み込みの代替品が必要です。
.
..
.bash_history
.ssh
updater_error_log.txt
解決
使用 -1
オプション(これは「1つの」数字であり、小文字「L」ではなく「1」の数字です)、次のようになります。
ls -1a
まず、あなたのことを確認してください ls
サポート -1
. 。 GNU Coreutils(標準Linuxシステムにインストール)およびSolaris do。しかし、疑わしい場合は、使用してください 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ではありません)では、別のアプローチがSSHを介してリモートファイルシステムをマウントすることです。 SSHFS, 、その後、ローカルで作業します。
使用できます ls -1
ls -l
また、仕事をします
ファイル名がnewlinesを含めない限り、簡単です。
find . -maxdepth 1
これを別のコマンドに配管する場合、nullバイトはファイル名で発生することはできないため、ニューラインではなく、nullバイトでファイル名を分離することを好むはずです(ただし、Newlines May):
find . -maxdepth 1 -print0
ターミナルにそれを印刷すると、ヌルバイトが通常印刷されていないため、おそらく1行として表示されます。一部のプログラムでは、ヌル削除入力を処理するための特定のオプションが必要になる場合があります。 sort
's -z
. 。あなた自身のスクリプトも同様にこれを説明する必要があります。