it-swarm.it

Come elencare i file senza directory e filtrare per nome (opzioni ls)

Ho una directory chiamata uploads. Contiene un mucchio di file, oltre ad alcune sottodirectory che a loro volta contengono file.

C'è un modo in cui posso (in un solo passaggio) fare quanto segue:

  1. Elencare SOLO i file nella directory dei caricamenti di root - Non voglio vedere i nomi delle sottocartelle o il loro contenuto;

    e

  2. NON elencare alcun file che inizia con t_

Conosco il -d flag, ma non mi dà esattamente quello che voglio.

45
EmmyS

Sembra un lavoro per find.

  • Uso -maxdepth per restituire solo la directory corrente, non ricorsivamente cercare all'interno delle sottocartelle
  • Uso -type f per restituire solo file e non directory o nodi del dispositivo o qualsiasi altra cosa
  • Usa una combinazione se -not e -name per evitare i file con nomi che non desideri

Potrebbe unirsi così:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
55
Caleb

GNU ls (ovvero il comando ls su sistemi Linux non incorporati e Cygwin, disponibile anche su alcuni altri unices) ha un'opzione per nascondere alcuni file, in base al loro nome. Non c'è modo di ignorare le directory però.

ls --hide='t_*' uploads

Un altro approccio è fare in modo che Shell esegua la corrispondenza. Bash, ksh e zsh hanno un modello di negazione !(t_*) per abbinare tutti i file tranne quelli corrispondenti t*; in bash questa funzione deve essere attivata con shopt -s extglob e in zsh deve essere attivata con setopt ksh_glob. Zsh ha anche la sintassi equivalente ^t_* Che deve essere attivata con setopt extended_glob. Questo non ignora ancora le directory. Zsh ha una funzione extra che permette di abbinare i file non solo per nome ma anche per metadati e altro: qualificatori glob . Aggiungi (.) Alla fine di una partita per limitarti ai file normali. La negazione ^ Fa parte della sintassi di corrispondenza dei nomi, quindi ^t_*(.) significa "tutti i file normali non corrispondenti a t_*" E non "tutti i file che non corrispondono regolarmente ai file t_*”.

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

Se ti trovi senza strumenti avanzati, puoi farlo su qualsiasi unix con find. Non è il tipo di cosa che digiti in genere sulla riga di comando, ma è potente e preciso. Caleb ha già mostrato come farlo con GNU find . L'opzione -maxdepth Non è portatile; puoi usare -Prune invece, per interrompere in modo portabile find dalla ricorrenza.

find uploads/* -type d -Prune -o \! -type f -name 't_*' -print

Sostituisci -print Con -exec ls -lG -- {} + Per eseguire ls con le tue opzioni preferite sui file.

Tutti i comandi sopra nascondono i file punto (ovvero i file il cui nome inizia con un .). Se si desidera visualizzarli, passare -A A ls o aggiungere il qualificatore D glob in zsh (ls uploads/^t_*(.D)). Con find, puoi utilizzare un approccio diverso per farlo ricorrere a un solo livello (find non tratta i file di punti in modo speciale). Funziona completamente solo se si esegue find nella directory corrente.

cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$

Se il problema di portabilità di max -epth di find è un problema, puoi usare:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

Non sono un esperto, ma penso che dovrebbe funzionare. Suppongo che sia un po 'enigmatico, ma se parli male, in realtà non lo è. $ NF potrebbe essere utilizzato invece di $ 9. Puoi anche fare:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

che fa la stessa cosa (ma forse in modo meno efficiente del precedente ???).

In realtà, dopo aver pensato agli altri post, sembra

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

è un modo ancora più breve e chiaro.

Qualcuno, per favore, correggimi se sbaglio. :-)

0
kkaszub

Ho trovato questi modi brevi:

ls -p uploads | grep -Ev '/'

o

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

Lasciami fare un tentativo usando ls e pipe:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

dire che l'ultima colonna è la nona.

0
Y0NG