Еще лучше, если он может найти каталоги, содержащие более двух файлов, исключая определенные типы файлов.
3 ответа
Если в именах файлов нет символов новой строки, то следующее находит все каталоги с двумя или более файлами размером более 100 КБ:
find . -type f -size +100k | sed -r 's|/[^/]*$||' | sort | uniq -d
Что касается «исключения определенных типов файлов», то для find
есть много вариантов.
Если на компьютере установлены самые последние версии sed
, вышеописанный подход можно расширить для обработки враждебных имен файлов. В качестве альтернативы, если доступна версия 4 bash
, используйте:
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
Я не очень хорош в сценариях оболочки, но что-то вроде этого распечатало бы каталоги, которые имеют больше чем два файла размером X байтов или больше
#!/bin/sh
for DIR in foo bar; do
if [ `find $DIR -mindepth 1 -size +Xc | wc -l` -gt 2 ]; then
echo $DIR
fi
done
Я не уверен, что вы подразумеваете под
найти каталоги, содержащие более двух файлов, исключая определенные типы файлов
но вы можете исключить файлы с определенными строками с помощью -not -name 'foo'
Это то же самое, что и ответ @ John1024, но он безопасен для всех возможных имен путей и выводит цитируемую оболочку имен.
find . -type f -size +100k -print0 | xargs -0 dirname -z | sort -z | uniq -d -z | xargs -0 ls -d --quoting-style=shell
Единственное улучшение, которое я знаю, помогло бы, если бы была команда, которая взяла нулевую строку с завершенными строками, заключила их в кавычки и напечатала их с символами новой строки, которые можно использовать вместо злоупотребления ls
.