Ls è progettato per il consumo umano e non dovresti analizzarne l'output .
Negli script di shell, ci sono alcuni casi in cui l'analisi dell'output di ls funziona è il modo più semplice per ottenere l'effetto desiderato. Poiché ls potrebbe manipolare caratteri non ASCII e controllare i caratteri nei nomi dei file, questi casi sono un sottoinsieme di quelli che non richiedono l'ottenimento di un nome file da ls
.
In Python, non c'è assolutamente alcun motivo per invocare ls
. Python ha tutte ls
le funzionalità integrate. Utilizzare os.listdir
per elencare il contenuto di una directory e os.stat
o os
per ottenere metadati di file. os
È probabile che anche altre funzioni nei moduli siano rilevanti per il tuo problema.
Se stai accedendo a file remoti su ssh, un modo ragionevolmente efficace per elencare i nomi dei file è tramite sftp:
echo ls -1 | sftp remote-site:dir
Questo stampa un nome file per riga e, diversamente ls
dall'utilità, sftp
non manipola i caratteri non stampabili. Non sarai ancora in grado di elencare in modo affidabile le directory in cui un nome file contiene una nuova riga, ma ciò avviene raramente (ricordalo come un potenziale problema di sicurezza, non un problema di usabilità).
In python (attenzione che i metacaratteri della shell devono essere in escape remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Per interazioni più complesse, cercare la modalità batch di sftp nella documentazione.
Su alcuni sistemi (Linux, Mac OS X, forse alcuni altri unices, ma sicuramente non Windows), un approccio diverso è montare un filesystem remoto tramite ssh con sshfs e quindi lavorare localmente.