Sì, puoi creare facilmente ls
genera un nome file per riga:
ls -a | cat
Spiegazione:Il comando ls
rileva se l'output è su un terminale o su un file o una pipe e si regola di conseguenza.
Quindi, se invii ls -a
in Python dovrebbe funzionare senza misure speciali.
puoi usare ls -1
ls -l
farà anche il lavoro
Usa il -1
opzione (nota che questa è una cifra "una", non una lettera minuscola "L"), come questa:
ls -1a
Prima, però, assicurati che il tuo ls
supporta -1
. GNU coreutils (installato su sistemi Linux standard) e Solaris lo fanno; ma in caso di dubbio, usa man ls
o ls --help
o controllare la documentazione. Ad esempio:
$ man ls
...
-1 list one file per line. Avoid '\n' with -q or -b
Ls è progettato per il consumo umano e non dovresti analizzare il suo 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. Dal momento che ls potrebbe manipolare i caratteri non ASCII e di controllo 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 tutto ls
funzionalità integrate. Usa os.listdir
per elencare il contenuto di una directory e os.stat
o os
per ottenere i metadati del file. Altre funzioni nel os
è probabile che anche i moduli siano rilevanti per il tuo problema.
Se stai accedendo a file remoti tramite ssh, un modo ragionevolmente affidabile per elencare i nomi dei file è tramite sftp:
echo ls -1 | sftp remote-site:dir
Questo stampa un nome di file per riga e diversamente da ls
utilità, sftp
non altera i caratteri non stampabili. Non sarai comunque in grado di elencare in modo affidabile le directory in cui un nome di file contiene una nuova riga, ma questo viene fatto raramente (ricorda questo come un potenziale problema di sicurezza, non un problema di usabilità).
In python (attenzione che i metacaratteri della shell devono essere escape in 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, cerca la modalità batch di sftp nella documentazione.
Su alcuni sistemi (Linux, Mac OS X, forse altri Unix, ma sicuramente non Windows), un approccio diverso consiste nel montare un filesystem remoto tramite ssh con sshfs e quindi lavorare in locale.