Come elencare prima i file e le directory con le directory


22

Ho due domande Primo, quale comando elenca file e directory, ma elenca prima le directory?

Seconda domanda: voglio copiare un elenco di file in una singola directory, ma rendere la directory di destinazione il primo nome file nel comando.


5
lsha un --group-directories-firstinterruttore.
Jasonwryan,

1
-tè probabilmente un'opzione solo per GNU cpche accetta una directory di destinazione esplicita e quindi può andare ovunque nella riga di comando, incluso l'inizio.
jw013,

Risposte:


36

Hai GNU?

La versione gnu di lshas --group-directories-first. E cpha -t.

No GNU?

Su sistemi che non hanno gnu ls, la tua scommessa migliore è due chiamate successive findcon -maxdepth n/ -mindepth ne -type tcon le opzioni appropriate.

find . -maxdepth 1 -mindepth 1 -type d
find . -maxdepth 1 -mindepth 1 \! -type d

Per copiare i file, prima con la destinazione, dovresti scrivere uno script che salvi il primo argomento, quindi lo usi shifte lo aggiunga fino alla fine.

#!/bin/sh
target="$1"
shift
cp -r -- "$@" "$target"

Attento!

Se stavi pianificando di usarli insieme, cioè raccogliere l'elenco da findo ls(possibilmente usando xargs) e passarlo a cp(o un cpwrapper), dovresti essere consapevole di quali pericoli risiedono nell'analisi degli elenchi di file (in pratica, i nomi dei file possono contiene caratteri come newline che possono rovinare la tua sceneggiatura). In particolare, sguardo find's -exece -print0le opzioni e xargs' s -0opzione.

Uno strumento alternativo per copiare in modo efficiente gli alberi delle directory.

Potresti voler esaminare rsyncinvece usando ; ha molte funzionalità che potrebbero semplificare il tuo lavoro.


Questo è fantastico Più in generale, c'è un modo per sapere se ho la versione GNU? (oltre a provare l'opzione --group-directories-first).
Amelio Vazquez-Reina,

3
Puoi correre ls --versionper scoprire quale hai.
Shawn J. Goff,

6

Elenca prima le directory per un non GNU ls:

ls -l | sort

Nota, questo elencherà tutto il gruppo di altre cose strane come collegamenti simbolici, socket e pipe (opportunamente raggruppate, ovviamente), ma considerando che le cose sono piuttosto rare che non dovrebbe essere un problema. Altrimenti il ​​filtro sarebbels -l | grep '^(-|d)' | sort


1
+1 intelligente e più breve della risposta accettata. Solo che dovrebbe davvero essere sort -r.
PythonNut,

1
ls -l | sort non ha funzionato per me su un Mac. Raggruppa prima le directory ma non le ordina né i nomi dei file che seguono.
Ray,

nota anche: usando il `| sort` rimuoverà il tuo colore come è ora il testo.
JayRizzo,

4

funziona per bash e zsh

aggiungi alias in ~ / .bashrc o ~ / .zshrc

# Colorize the ls output ##
alias ls='LC_COLLATE=C ls -h --group-directories-first --color=auto'

Inoltre, se hai ZSH, puoi usare l' utilità "k"

k -h --group-directories-first

inserisci qui la descrizione dell'immagine

basta installarlo con antigen, inserendo quanto segue in ~ / .zshrc

antigen bundle reduxionist/k --branch=add-sort-options

1
bella risposta per offrire l'alias.
рüффп,

0

Per zshgli elenchi di completamento, è possibile impostare lo list-dirs-firststile trueper visualizzare prima le directory. Nel tuo ~/.zshrc:

zstyle ':completion:*' list-dirs-first true

(qui applicato a tutti i widget di completamento che lo supportano e per tutti i comandi; puoi limitarlo se vuoi, consulta la zstyledocumentazione per i dettagli)

Se non l'hai già fatto, assicurati di eseguire compinstallanche per ottenere elenchi di completamento a colori, con descrizioni, ecc. E tutte le altre chicche.


0

Per i non GNU, awk può filtrare tutti gli altri campi:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: l'output di ls -lmust contiene 9 campi
  • se la riga inizia con 'd', stampa un ulteriore '/'
  • altrimenti solo il nome del file

L'output è simile ls -1ma con le directory messe al primo posto:

node_modules/
src/
e2e/
angular.json
tslint.json
package.json
README.md

Secondo "The Long Format" della pagina man ls, quando vengono coinvolti altri tipi di file, l'ordine di output dovrebbe essere:

   s     Socket link.
   p     FIFO.
   l     Symbolic link.
   d     Directory.
   c     Character special file.
   b     Block special file.
   -     Regular file.

Una comoda funzione bash (inseriscila nel tuo .bash_profile o .bashrc):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}
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.