Come distinguere separatamente il numero di file, directory, link simbolici e collegamenti duri all'interno di un'unica ricerca?

Per controllare una migrazione di successo, sto utilizzando find per contare il numero di file, directory, link simbolici e file con più di un collegamento duro. Poiché le directory da controllare contengono un enorme numero di file, each esecuzione di find richiede diverse ore. Quindi cerco un modo per distinguere separatamente il numero di file, directory, link simbolici e file con più di un collegamento duro all'interno di un'unica find .

Ecco cosa faccio adesso

 num_files=$(find $directory -type f | wc -l) num_directories=$(find $directory -type d | wc -l) num_symlinks=$(find $directory -type l | wc -l) num_hardlinks=$(find $directory -type f -links +1 | wc -l) 

Come posso get quei quattro contatori all'interno di una find run?

Le seguenti dovrebbero farlo. Richiede GNU; su OS X, installa eg findutil utilizzando Homebrew.

 find $directory -type d -printf d -o -type l -printf l -o -type f -links +1 -printf h -o -type f -printf f 

In questo modo verrà printingto un carattere per each voce di file system rilevata:

  • d se è un file
  • Se è un collegamento simbolico
  • h se è un file con collegamenti duri
  • f se è un file (solo se non h )

L'output sembra questo (estratto effettivo sul mio sistema):

dfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdffffffffddfdffdfffffffffddfdldfllfdlldffffdfllfdlllllldffffdffffldfllfddffdldfddddffffflllldllllldlffffldfllfdlldffffdfllfddffddfddddfffffldfddddfffffdfddddfffffdlllldffffldfffflflllldffflfdffflfdfllfddffffldffffdfffflldfffflllldffffdffffdfffflldfllfddffdldfddddfffffdllllddflfffflldfllfddffffdffffdffffldffffdffffdffffdffffllldffffldffffdffffldffffldffffdffffdffffllllllldffffldffffdfffflllllldfffflldffddldfllfdldfffflldfffflldffffdfffflldffffdffffdfllfdlldfffflllldfllfdlldffffdfllfdlllllldffffdffdldfllfdlldfffflldfffflldffffldffffldfffflldfllfdldffffldffffldffdldffdddffddffddffddldfllfdlldffffdffffdfffflldfffflldffffdffffllldffffdffffdfllfddffffldfffflllldffffldfffflllldffffdfllfddffdldddddfffdddddfffdddddfffdddddfffdldlfffflldlffffllldfffllldffffdlffffdlffffldfffflldffdldfllfdllldffffdffffdffffldfllfdlllldfffflldfllfdldfddffffffl

Ridisegna l'output a un file e poi viene trasformato in una semplice elaborazione delle stringhe per conteggiare più tardi.

 find $directory -type d -exec echo dirs \; -o -type l -exec echo symlinks \; -o -type f -links +1 -exec echo hardlinks \; -o -type f -exec echo files \; | sort | uniq -c 

Produce l'output come:

  326 dirs 2164 files 40 hardlinks 164 symlinks 

Utilizzando la risposta di Daniel Beck ho sviluppato la seguente soluzione che dovrebbe funzionare per la maggior parte delle versioni di find e fornisce anche la magia di count:

 output=$(find $directory -type d -exec printf d \; -o -type l -exec printf l \; -o -type f -links +1 -exec printf h \; -o -type f -exec printf f \;) num_files=$(echo $output | grep -o "f" | wc -l) num_directories=$(echo $output | grep -o "d" | wc -l) num_symlinks=$(echo $output | grep -o "l" | wc -l) num_hardlinks=$(echo $output | grep -o "h" | wc -l)