elencando i file in una directory senza elencare le sottodirectory e il loro contenuto in quella directory


24

Voglio creare un elenco di tutti i file in una directory, senza elencare nessuna delle sottodirectory che risiedono in quella stessa directory e stampare quell'elenco su un nuovo file.

ls -d * > filelist

creerà un elenco di tutti i file nella directory corrente, ma elenca anche le sottodirectory nella directory corrente. Ho provato il findcomando usando l' -maxdepth 1opzione - tuttavia, il formato di output è un problema in quanto find stampa anche il percorso insieme ai nomi dei file.

Se qualcuno può dirmi forse un altro comando o opzioni da utilizzare che produrrà un elenco di output dei soli file in una directory e non i nomi delle sottodirectory o il loro contenuto, lo apprezzerei.


2
Sono confuso ls -d *elencare solo i file e le cartelle nella cartella corrente escludendo file / cartelle nascosti qui;
GM-Script-Writer-62850

sì, ma non voglio che siano elencate le cartelle in quella directory, voglio solo elencare i file in quella directory
janet

Risposte:


22

Soluzione basata sulla ricerca:

find . -maxdepth 1 -type f -printf '%f\n'

Soluzione basata su Bash:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

La soluzione basata su bash ti porterà tutto ciò che non è una directory; includerà cose come named pipe (probabilmente lo vorrai). Se si desidera specificamente solo i file , utilizzare il findcomando o uno di questi:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Se lo utilizzerai regolarmente, puoi ovviamente inserirlo in un alias da qualche parte nel tuo ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Dato che nei commenti hai notato che sei effettivamente su OSX piuttosto che su Ubuntu, suggerirei che la prossima volta rivolgerai domande ai siti di scambio stack Unix e Linux più generali di Apple .


1
Assicurati di verificare che queste soluzioni siano corrette per te in base al fatto che tu voglia o meno includere file nascosti.
Kevin Wheeler,

10

Elenca solo i nomi dei file:

1. ls -p | grep -v / (senza file nascosti)
 2. ls -l | grep ^ - | tr -s '' | cut -d '' -f 9 (senza file nascosti)

 a) ls -pa | grep -v / (con file nascosti)
 b) ls -la | grep ^ - | tr -s '' | cut -d '' -f (con file nascosti)

Elenca solo le directory:

1. ls -p | grep / (senza nascosto)
 2. ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (senza nascosto)

 a) ls -pa | grep / (con nascosto)
 b) ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (con nascosto)

grep -v -e ^ $ è per rimuovere le righe vuote dal risultato.

Maggiori dettagli :
ls -p flag deve mettere '/' alla fine del nome della directory, -R flag per la ricerca ricorsiva, -l per la lista con informazioni, -a per la lista di tutti (compresi i file nascosti) con informazioni, grep -v flag è per l'inversione dei risultati e -e flag per la corrispondenza regex.


7

Per elencare solo i file regolari:

ls -al | grep ^-

Con collegamenti simbolici inclusi:

ls -al | grep ^[-l]

Dove il primo carattere dell'elenco descrive il tipo di file, -significa che si tratta di un file normale, per il collegamento simbolico l.

Debian / Ubuntu

Stampa i nomi di tutti i file corrispondenti (compresi i collegamenti):

run-parts --list --regex . .

Con percorsi assoluti:

run-parts --list --regex . $PWD

Stampa i nomi di tutti i file /etcche iniziano con pe finiscono con d:

run-parts --list --regex '^p.*d$' /etc

5

Ancora un'altra soluzione, ingenuamente breve che ha funzionato per me:

ls -la | grep -E '^[^d]' > files

perfetto per me,ls -alR |grep -E '^-'
qui

4

Suggerirei di usare find e di rimuovere il nome della directory dall'output, se necessario:

find . -type f -maxdepth 1 | sed s,^./,,

2
-maxdepth 1dovrebbe venire prima di qualsiasi filtro, e puoi ottenere questo risultato senza usare sedcon l' -printfopzione, cioè: find . -maxdepth 1 -type f -printf '%f\n'(questo sarà più efficiente rispetto all'utilizzo di un programma extra).
evilsoup,

3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Un'altra possibile opzione è

ls -F | grep -v '/' | sed /[@*]$// > filelist

Il --file-typemette un / alla fine delle cartelle (ma anche un @ alla fine dei collegamenti simbolici. The grep -v '/'Rimuove le sottodirectory (perché ora terminano con un '/'). sed s/@$//Rimuove quel @. Il -1 stampa un file per riga in modo che grep -v funzioni correttamente.


Grazie per la vostra risposta. sfortunatamente, non funziona per me, forse lo sto eseguendo in modo errato. se uso il comando esatto che mi hai dato, ottengo il seguente errore: ls: opzione illegale - - utilizzo: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [file ...] ho provato a utilizzare il carattere jolly * al posto di e anche in congiuntamente a --file-type. se potessi chiarire lo apprezzerei!
janet

Il comando funziona per me (in esecuzione 13.04), quale versione di Ubuntu stai usando ?; -1non importa a grep non ne hai bisogno; se vuoi includere file nascosti usa l' -aopzione suls
GM-Script-Writer-62850

in realtà, sto lavorando su un mac. forse il comando è leggermente diverso su mac os x o unix?
janet

1
Potresti anche provarels -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower
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.