Come escludo le directory quando si elencano i file?


21

Come escludo le directory quando si elencano i file nella directory corrente?

ls .

^ includerà le directory nell'elenco.

Risposte:


23

Prova questo:

find . -maxdepth 1 -not -type d

3
mantienilo semplice: $ find. -tipo f
bloccato il

9
No. (1) sarebbe ricorsivo, (2) non elencherebbe collegamenti simbolici. @Steve ha chiesto un equivalente ls .senza directory - ed eccolo qui.
Alexander Gladysh,

2
Aggiungendo -lso -exec ls -l {} \;lo farebbe come ls -lsenza directory.
Ladadadada,

15

Per ottenerlo esattamente equivalente a ls .te non devi mostrare dir nascoste.

find . -maxdepth 1 -not -type d -and -not -name '.*'

e questo ti lascia ancora con './' prefissato per ogni nome file. Non è davvero un problema, ma penso che sia piuttosto brutto. Sono andato con:

ls -p | grep -v '/$'

E questo ti darà un elenco che sembra lo stesso, e puoi anche aggiungere ulteriori lsargomenti. Aggiungi un --color=alwayse riavrai i tuoi dircolor o -aper vedere i file nascosti.

Mi piace la risposta di Alexander perché in realtà dipende dalle caratteristiche del filesystem del file in questione, quindi non verrà mai ingannato. La mia risposta verrà ingannata da un file che ha un '/' come ultimo carattere nel suo nome. Ma sembra che stia chiedendo problemi.


1
'-not' è GNU trova correlato, poiché non è conforme a POSIX, è meglio non insegnare queste opzioni poiché un utente potrebbe avere habbit "cattivi" e sentirsi perso su altri UNIX :)
jirib

2
@JiriXichtkniha qual è l'alternativa POSIX a -not?
Lucas Gallindo,

5

prova questo:

$ find. -tipo f -maxdepth 1

o questo:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d


3

Anche se è un vecchio post, ma ho pensato che questo potesse aiutare ..

$ ls -l | grep -v ^ d

Elencherà tutti i file inclusi collegamenti simbolici, caratteri e file di blocco.


Questa risposta era già stata fornita più di un anno prima da jamzed, (facendo questo rumore visivo.)
Alexx Roche

2

Le soluzioni "trova" sopra perdono alcune delle funzionalità di ls , ad esempio: elenca solo i file, ordinati in base al tempo di modifica decrescente.

Le risposte "ls -p | grep" non si occupano elegantemente di altri elementi di ls come -R, se lo si desidera

La risposta seguente, mentre più prolisso, a mio parere riflette il vero ls comportamento e massima flessibilità per la selezione di "solo i file"

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

Basta sostituire gli interruttori ls come desiderato e il risultato verrà restituito solo con i file. Se sono necessari anche collegamenti e altri elementi, è necessario eseguire piccole modifiche al test per l'inclusione.


0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

Con questo è ancora possibile utilizzare qualsiasi altra opzione di lssolito prende. Oppure ... rimuovi -vper elencare solo le directory. Oppure ... sostituisci la directory con qualsiasi altro tipo di file che filecapisca e riferisca, come ASCII, vuoto, ELF e così via.


Questo non funziona se uno dei nomi di file da elencare contiene spazi.
Psiconauta

ls -t .|while read f;do [ -f "$f" ]&& echo $f;doneè circa 3 volte più veloce nei miei test
Alexx Roche

0

Ero su un sistema in cui il findbinario non supportava -note ho finito per usare:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Vantaggi: non si basa su nulla di diverso da sh ls echo
È compatibile con bash e dash
Può essere modificato per adattarsi ad altre cose (come le directory) cambiando -f
È più veloce di alcune delle risposte e utilizza meno RAM e CPU

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.