Voglio sapere quanti file regolari hanno l'estensione .c
in una grande struttura di directory complessa e anche quante directory questi file sono distribuiti. L'output che voglio è solo quei due numeri.
Ho visto questa domanda su come ottenere il numero di file, ma devo sapere anche il numero di directory in cui si trovano i file.
- I miei nomi di file (comprese le directory) potrebbero avere caratteri; possono iniziare con
.
o-
e avere spazi o nuove righe. - Potrei avere alcuni symlink i cui nomi finiscono
.c
e symlink alle directory. Non voglio che i collegamenti simbolici vengano seguiti o contati, o almeno voglio sapere se e quando vengono contati. - La struttura della directory ha molti livelli e la directory di livello superiore (la directory di lavoro) contiene almeno un
.c
file.
Ho scritto in fretta alcuni comandi nella shell (Bash) per contarli da solo, ma non credo che il risultato sia accurato ...
shopt -s dotglob
shopt -s globstar
mkdir out
for d in **/; do
find "$d" -maxdepth 1 -type f -name "*.c" >> out/$(basename "$d")
done
ls -1Aq out | wc -l
cat out/* | wc -l
Ciò genera reclami su reindirizzamenti ambigui, manca i file nella directory corrente e scatta su caratteri speciali (ad esempio, l' output reindirizzato find
stampa nuove righe nei nomi dei file ) e scrive un intero gruppo di file vuoti (oops).
Come posso enumerare in modo affidabile i miei .c
file e le loro directory di contenimento?
Nel caso in cui aiuti, ecco alcuni comandi per creare una struttura di test con nomi errati e collegamenti simbolici:
mkdir -p cfiles/{1..3}/{a..b} && cd cfiles
mkdir space\ d
touch -- i.c -.c bad\ .c 'terrible
.c' not-c .hidden.c
for d in space\ d 1 2 2/{a..b} 3/b; do cp -t "$d" -- *.c; done
ln -s 2 dirlink
ln -s 3/b/i.c filelink.c
Nella struttura risultante, 7 directory contengono .c
file e 29 file regolari terminano con .c
(se dotglob
è disattivato quando vengono eseguiti i comandi) (se ho sbagliato il conto, per favore fatemi sapere). Questi sono i numeri che voglio.
Sentiti libero di non usare questo particolare test.
NB: Le risposte in qualsiasi shell o altra lingua saranno testate e apprezzate da me. Se devo installare nuovi pacchetti, nessun problema. Se conosci una soluzione GUI, ti incoraggio a condividere (ma potrei non arrivare al punto di installare un intero DE per testarlo) :) Uso Ubuntu MATE 17.10.