Ancora meglio è se riesce a trovare le directory che hanno più di due file escludendo determinati tipi di file.
Ancora meglio è se riesce a trovare le directory che hanno più di due file escludendo determinati tipi di file.
Risposte:
Se i nomi dei file non contengono caratteri di nuova riga, in seguito vengono trovate tutte le directory con due o più file con dimensioni pari a 100k:
find . -type f -size +100k | sed -r 's|/[^/]*$||' | sort | uniq -d
Per quanto riguarda "l'esclusione di determinati tipi di file" find ha molte molte opzioni per questo.
Se uno ha le versioni più recenti di sed installato, quindi l'approccio sopra può essere esteso per gestire i nomi di file ostili. In alternativa, se ne hai uno bash versione 4 disponibile, quindi utilizzare:
declare -A a
find . -type f -size +100k -print0 | while IFS= read -r -d '' fname
do
dir="$(dirname "$fname")"
((a["$dir"]++))
[[ "${a["$dir"]}" -eq 2 ]] && echo "$dir"
done
Non sono molto bravo con gli script di shell, ma qualcosa di simile dovrebbe stampare le directory che hanno più di due file con dimensioni di X byte o più grandi
#!/bin/sh
for DIR in foo bar; do
if [ `find $DIR -mindepth 1 -size +Xc | wc -l` -gt 2 ]; then
echo $DIR
fi
done
Non sono sicuro di cosa intendi
trova le directory che hanno più di due file escludendo determinati tipi di file
ma puoi escludere i file con determinate stringhe con -not -name 'foo'
Questa è la stessa risposta di @ John1024 ma è sicura per tutti i possibili nomi di percorso e restituisce la shell dei nomi quotata.
find . -type f -size +100k -print0 | xargs -0 dirname -z | sort -z | uniq -d -z | xargs -0 ls -d --quoting-style=shell
L'unico miglioramento che so sarebbe di aiuto se ci fosse un comando che ha preso zero le linee terminate shell li ha citati e li ha stampati con linee nuove che potrebbero essere usate piuttosto che abusare ls.