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

Я знаю, что могу использовать wc -l для проверки каждого файла, но как мне обернуть его в bash?

Извините за вопрос новичка, новичок в bash.

10
Vendetta 27 Окт 2015 в 17:40

3 ответа

Лучший ответ

Вы можете использовать эту команду find:

find . -type f -exec bash -c '[[ $(wc -l < "$1") -gt 2 ]] && echo "$1"' _ '{}' \;
10
anubhava 27 Окт 2015 в 16:42

Перейдите в каталог, в котором находятся файлы, и используйте следующую команду:

for i in $(ls);
do
    if [ `grep -c '' $i` -gt 2 ]; then 
        echo `wc -l $i`;
    fi;
done

Это работает, конечно, также как однострочный оператор;)

Эта строка выполняет итерацию по каждому файлу и использует для него команду grep, чтобы получить чистое количество строк. wc -l тоже получает счет, но результат включает имя файла ... Я не знаю, можно ли было бы использовать значение для сравнения тоже ... но это не имеет значения: если количество строк больше 2 (-gt 2), тогда wc -l $ i выведет количество строк и имя файла. Если вы хотите видеть только имя файла, замените wc -l $i на $ i.

Конечно, я не проверял, является ли каждая запись файлом. Вы можете сделать это до проверки количества строк.

ОБНОВЛЕНИЕ: хотя использование ls для синтаксического анализа не рекомендуется, его все же можно использовать. Вам просто нужно заранее убедиться, что ваши имена файлов не содержат символов новой строки (или других нечетных).

0
Acuros 29 Окт 2015 в 09:50

Использование xargs и awk:

$ find . -type f | xargs wc -l | awk '$1 > 2'

Если вы находитесь в репозитории git и хотите подсчитывать только отслеживаемые файлы, вы можете использовать следующую команду:

$ git ls-files | xargs wc -l | awk '$1 > 2'
8
Hotschke 16 Фев 2018 в 07:56