Domanda

Sto usando il comando ls -a per ottenere i nomi dei file in una directory, ma l'uscita è in una sola riga.

In questo modo:

.  ..  .bash_history  .ssh  updater_error_log.txt

Ho bisogno di un built-in alternativa per ottenere i nomi dei file, ciascuna su una nuova linea, in questo modo:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
È stato utile?

Soluzione

Utilizzare l'opzione -1 (notare che questo è un numero "uno", non è una lettera minuscola "L"), in questo modo:

ls -1a

Per prima cosa, però, assicurarsi che il supporto ls -1. coreutils GNU (installati su sistemi standard di Linux) e Solaris fanno; ma, nel dubbio, uso o man ls ls --help o controllare la documentazione. Per esempio:.

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

Altri suggerimenti

Sì, si può facilmente rendere uscita ls un nome di file per riga:

ls -a | cat

. Spiegazione: I sensi di comando ls Se l'uscita è ad un terminale o ad un file o una pipa e regola di conseguenza

Quindi, se il tubo ls -a a Python dovrebbe funzionare senza misure particolari.

Ls è stato progettato per il consumo umano, e non si deve analizzare la sua uscita .

In shell script, 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 potrebbero manipolare i non-ASCII e controllo caratteri nei nomi di file, questi casi sono un sottoinsieme di quelle che non richiedono l'ottenimento di un nome di file da ls.

In Python, non c'è assolutamente alcuna ragione per invocare ls. Python ha tutte le funzionalità di ls built-in. 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 moduli sono suscettibili di essere rilevanti per il vostro problema pure.


Se si accede ai file da remoto tramite SSH, un modo ragionevolmente robusta di elencare i nomi dei file avviene attraverso sftp:

echo ls -1 | sftp remote-site:dir

Questo stampa un nome di file per riga, e, a differenza l'utilità ls, sftp fa caratteri non stampabili non mangano. Sarà ancora non essere in grado di directory lista affidabile in cui un nome di file contiene un ritorno a capo, ma questo è raramente fatto (ricordate questo come un potenziale problema di sicurezza, non è un problema di usabilità).

In pitone (attenzione che metacaratteri di shell deve essere fughe 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, cercare modalità batch di SFTP nella documentazione.

Su alcuni sistemi (Linux, Mac OS X, forse alcuni altri sistemi Unix, ma sicuramente non Windows), un approccio diverso è quello di montare un filesystem remoto tramite ssh con sshfs , e poi lavorare a livello locale.

è possibile utilizzare ls -1

ls -l anche fare il lavoro

facile, a patto che i nomi dei file non includono nuove righe:

find . -maxdepth 1

Se stai tubazioni questo in un altro comando, probabilmente si dovrebbe preferire per separare i nomi dei file da byte nulli, piuttosto che a capo, dal momento che i byte nulli non possono verificarsi in un nome di file (ma ritorni a capo maggio):

find . -maxdepth 1 -print0

Stampa che su un terminale probabilmente visualizzato come una riga, perché i byte nulli non sono normalmente stampati. Alcuni programmi potrebbero richiedere una specifica opzione per gestire l'input nullo delimitato, come sort di -z. Il proprio script simile avrebbe bisogno di account per questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top