Еще лучше, если он может найти каталоги, содержащие более двух файлов, исключая определенные типы файлов.

3 ответа3

1

Если в именах файлов нет символов новой строки, то следующее находит все каталоги с двумя или более файлами размером более 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
0

Я не очень хорош в сценариях оболочки, но что-то вроде этого распечатало бы каталоги, которые имеют больше чем два файла размером 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'

0

Это то же самое, что и ответ @ John1024, но он безопасен для всех возможных имен путей и выводит цитируемую оболочку имен.

find . -type f -size +100k -print0 | xargs -0 dirname -z | sort -z | uniq -d -z | xargs -0 ls -d --quoting-style=shell

Единственное улучшение, которое я знаю, помогло бы, если бы была команда, которая взяла нулевую строку с завершенными строками, заключила их в кавычки и напечатала их с символами новой строки, которые можно использовать вместо злоупотребления ls .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .