Vorrei usare il ls
comando per mostrare prima le directory e poi i file. Provai:
ls -la | sort -k 1
Ma ho ricevuto un ordine sbagliato.
ls -lh --group-directories-first
Vorrei usare il ls
comando per mostrare prima le directory e poi i file. Provai:
ls -la | sort -k 1
Ma ho ricevuto un ordine sbagliato.
ls -lh --group-directories-first
Risposte:
Il seguente comando elencherà prima le directory, i file ordinari secondo e i collegamenti terzi.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Inoltre, sarebbe molto sensato creare un alias per questo comando per salvare i tasti.
Modificare:
Se prima vuoi le directory e poi tutto ciò che non è una directory, usa questo:
ls -la | grep "^d" && ls -la | grep -v "^d"
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"
?
alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
ls -la|grep ^d;ls -la|grep -v ^d
(le virgolette non sono obbligatorie e sostituite &&
con ;
). Un'altra opzione è quella di introdurre una variabile e poi valutare: a="ls -la|grep ^d";eval $a;eval $a -v
. Potrebbe essere utile per evitare le ripetizioni quando sono specificate molte più opzioni su ls
/ grep
. C'è anche questa ls -la --group-directories-first
opzione, comunque l'imo più corto èls -la|sort
Adoro * nix e amo vedere l'inventiva che si cela in alcune di queste risposte ...
Il mio non è così elegante su GNU Linux:
alias ls='ls --color -h --group-directories-first'
Dato che mi sento più a mio agio con le mie app CLI per Linux, tendo ad aggiornare anche coreutils su OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
brew install bash
allora dovresti , allora funzionerà! :)
Coreutils per utenti Mac :
brew install coreutils
alias ls='ls --color -h --group-directories-first'
Supponendo che il tuo sistema sia pronto per l' homebrew :
gls
piuttosto. Giusto?
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.
Ci sono alcune cose che voglio vedere in un elenco di directory, e finora nessuna delle risposte qui soddisfa tutti i requisiti di seguito. I miei requisiti per un elenco di directory:
./
e ../
), file e collegamenti--group-directories-first
non funzionano in Git Bash per WindowsDopo molti hacking, ho finalmente trovato un one-liner (anche se una linea molto lunga ;-)) di cui sono soddisfatto. Ho assegnato questo a un alias chiamato 'dir':
ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" |
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" |
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . |
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f |
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- |
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)
Per rendere le cose più facili da gestire, mi sono venuti in mente comandi separati per l'output di ogni segmento dell'elenco delle directory di mio gradimento, quindi li ho assemblati insieme usando l' &&
operatore.
ls -dlF --color * .* | head -n2
- Estrai ./
e ../
. Non vogliamo passare attraverso questi sort
perché sono già nell'ordine corretto e l'ordinamento può comportare la ../
prima elencazione. L' -d
opzione è di sbarazzarsi della linea "totale"; Mi piace aggiungere -F
per mostrare la barra finale per le directory (segnerà anche i collegamenti simbolici con "@" quando si fa una pianura ls -F
).
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Estrai le directory e ordinale per nome file (nona colonna), ignorando sia i caratteri non alfa / spaziali ( d
opzione) sia i caratteri maiuscoli ( f
opzione). L' ls -A
opzione esclude ./
e ../
dall'elenco poiché li abbiamo già estratti nel passaggio precedente. Tendo a precedere tutto grep
e i sort
comandi con il LC_ALL=C
ripristino delle impostazioni internazionali in modo che (1) l'output sia coerente tra le shell Unix e (2) a volte puoi vedere prestazioni più veloci poiché non ha più l'overhead del pesante carattere UTF-8 impostato su avere a che fare con.
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Questo è simile al passaggio precedente, ma questa volta stiamo ordinando file e collegamenti simbolici.
find -maxdepth 1 -type d ! -name . | wc -l
- Ottieni il numero di directory, esclusi ./
e ../
.
find -maxdepth 1 -type f | wc -l
- Ottieni il numero di file.
find -maxdepth 1 -type l | wc -l
- Ottieni il numero di symlink.
du -hs | cut -f 1
- Estrai la dimensione totale di tutte le sottodirectory in formato leggibile dall'uomo.
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Estrai la dimensione totale di tutti i file in formato leggibile dall'uomo.
Vediamo il nostro nuovo dir
alias in azione!
PRIMA:
$ ls -alF
total 22
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
DOPO:
$ dir
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
5 Dir(s) 2.8M 6 File(s) 31K 0 Link(s)
Uno svantaggio minore è che non puoi avere elenchi colorati, poiché i caratteri di controllo del colore che circondano i nomi dei file rendono l'ordinamento troppo inaffidabile.
AGGIORNARE
L'alias sopra era dolorosamente lento quando eseguito dalla directory principale di un file system profondo, quindi ho aggiornato a questo comando più semplice ma molto più performante:
ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'
Uscita campione:
$ dir
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom 0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom 0 Jun 16 2016 temp/
drwxr-xr-x 1 Tom 0 Jul 13 2016 vimfiles/
-rw-r--r-- 2 Tom 365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom 2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom 2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom 1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom 8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom 2444 Jul 13 2016 _vimrc
33819 bytes
Poiché la nuova versione di Git Bash per Windows supporta --group-directories-first
, non è più necessario ripiegare sort
. Anche se il nuovo alias non mostra quante più informazioni del precedente alias, i guadagni in termini di prestazioni sono più che ne vale la pena. Come vantaggio, ottieni anche i colori!
Hai diverse scelte, a seconda se vuoi mantenere l'ordine alfabetico.
Potresti semplicemente provare:
ls -al | ordina -k1 -r
o questo, per mantenere l'ordine alfabetico per i file con le stesse autorizzazioni:
ls -al | ordina -k1,1 -k9,9 -r
o, come diceva undici81 (ma questa versione elenca tutto):
ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v "^ [d | -]"
ls- al|sort -k1 -r
funziona. Ciò che mancava è solo la -r
bandiera.
./
e ../
non saranno le prime due righe, in questo ordine. A parte questo, sono d'accordo che sia la soluzione più efficiente.
Alla risposta delerious010 , aggiungerei che se si desidera un ordinamento vecchio stile:
LANG=C ls -la --group-directories-first
(oppure usa LC_ALL o LANGUAGE o LC_COLLATE impostato su "C").
Questo darà qualcosa di simile a:
.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file
Anche se, se ricordo bene, i file di punti nascosti apparivano originariamente prima delle directory.
Ecco una funzione per fare questo (bash o zsh): E ... Non sto suggerendo che questo è il modo migliore, ma è quello che ho inventato e sto usando in questo momento:
funzione lss { # Mostra l'elenco delle directory con le directory in alto. comando ls --color = sempre $ @ | egrep '^ d | totale' comando ls --color = sempre $ @ | egrep -v '^ d | total'; }
ls -l
) per filtrare in base al tipo di file in questo modo. Inoltre, questo comando si interromperà sugli spazi (in bash). Devi citare in questo modo: "$@"
Se vuoi usare questo approccio, potresti fare qualcosa del genere:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
ti mostrerà prima le directory in ordine alfabetico, ma rovinerà l'elenco dei file.
Opzioni lunghe:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
Un altro modo ...
find . -d 1 -type d | ls -la | sort -r
O
ls -la | sort -r
O
d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"
alias ls='ls -lhF --color'
list_sorted() {
ls $* | grep "^d";
ls $* | grep "^-";
ls $* | grep -v -E "^d|^-|^total"
}
alias ll=list_sorted
Uso una combinazione delle soluzioni fornite nelle risposte e nei commenti qui.
ls
Innanzitutto, sovrascrivo il comportamento predefinito per ls
:
-l
: Visualizza sempre l'elenco come un elenco monodimensionale e verticale-h
: Visualizza le dimensioni dei file in modo leggibile dall'uomo (ad es. 4.0K anziché 4096)-F
: Visualizza gli indicatori come una barra finale per le directoryalias ls='ls -lhF --color'
ll
Successivamente, scrivo una funzione contenente la logica di ordinamento. Per ognuno ls
passo qualsiasi argomento originariamente passato ad esso. Ciò mi consente di utilizzare l'alias da una directory di lavoro diversa da quella che desidero elencare (ad es ls -a ~
.).
Inoltre, ogni chiamata a ls
viene reindirizzata a un grep
comando. Qui, l'ordinamento avviene. ls -l | grep "^d"
ad esempio elenca solo le directory. Se le directory devono essere elencate per prime, anche questa deve venire prima nella funzione. La prossima cosa sono i file.
Infine, mostro tutto ciò che non è né una directory né un file (né la riga che mostra la dimensione totale del contenuto della directory). Questo viene fatto avviando directoy, voci di file regolari e la voce totale e quindi invertendo il risultato tramite l' -v
argomento.
list_sorted() {
# List directories
ls $* | grep "^d";
# List regular files
ls $* | grep "^-";
# List everything else (e.g. symbolic links)
ls $* | grep -v -E "^d|^-|^total"
}
Infine, alias la funzione su un nuovo comando. In particolare, non voglio sovrascrivere ls
nel caso in cui la mia funzione si interrompa in alcuni scenari. Quindi voglio essere in grado di usare ls
. In alternativa, puoi sempre invocare il ls
comando senza alias invocando \ls
.
alias ll=list_sorted
;
invece &&
come delimitatore per i comandi. Altrimenti, non è possibile elencare i contenuti delle directory che non contengono directory (il primo comando ls viene valutato come falso, quindi non consente l'esecuzione del comando successivo poiché è accoppiato con &&
. ;
Evita quello.)Questa è una soluzione di script. Elenca solo i nomi, nessun dato inode, alfabetico, senza distinzione tra maiuscole e minuscole, formattato in colonne. Sebbene sia il maggiore di riga anziché il maggiore di colonna come l'output predefinito di ls. Le colonne diventano un po 'confuse se c'è un nome file con> 26 caratteri.
rm -f /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
E un altro, con qualche formattazione extra.
rm -f /tmp/lsout
echo " ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
rm -f /tmp/lsout
echo " ------- Files ------- " >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
L'output per l'ultimo è simile al seguente, meno i colori:
---- Directories ---- archive/ bookmarks/
Desktop/ Documents/ Downloads/
fff/ health/ Library/
Movies/ Music/ Pictures/
Public/ rrf/ scifi/
testdir/ testdir2/
------- Files ------- @todo comedy
delme lll maxims
schedule vtokens style
Basta ricordare di non alias o modificare il comportamento predefinito di ls poiché questo script lo chiama.
-
viene primad
quando si utilizzasort