Linux: удаляйте файлы, которые не содержат определенного количества строк - PullRequest
5 голосов
/ 01 июня 2009

Как удалить файлы в каталоге, которые содержат больше или меньше строк, чем указано (все файлы имеют суффикс ".txt")?

Ответы [ 7 ]

11 голосов
/ 01 июня 2009

Этот bash-скрипт должен помочь. Сохранить как "rmlc.sh".

Пример использования:

rmlc.sh -more 20 *.txt   # Remove all .txt files with more than 20 lines
rmlc.sh -less 15 *       # Remove ALL files with fewer than 15 lines

Обратите внимание, что если скрипт rmlc.sh находится в текущем каталоге, он защищен от удаления.


#!/bin/sh

# rmlc.sh - Remove by line count

SCRIPTNAME="rmlc.sh"
IFS=""

# Parse arguments 
if [ $# -lt 3 ]; then
    echo "Usage:"
    echo "$SCRIPTNAME [-more|-less] [numlines] file1 file2..."
    exit 
fi

if [ $1 == "-more" ]; then
    COMPARE="-gt" 
elif [ $1 == "-less" ]; then
    COMPARE="-lt" 
else
    echo "First argument must be -more or -less"
    exit 
fi

LINECOUNT=$2

# Discard non-filename arguments
shift 2

for filename in $*; do
    # Make sure we're dealing with a regular file first
    if [ ! -f "$filename" ]; then
        echo "Ignoring $filename"
        continue
    fi

    # We probably don't want to delete ourselves if script is in current dir
    if [ "$filename" == "$SCRIPTNAME" ]; then
        continue
    fi

    # Feed wc with stdin so that output doesn't include filename
    lines=`cat "$filename" | wc -l`

    # Check criteria and delete
    if [ $lines $COMPARE $LINECOUNT ]; then
        echo "Deleting $filename"
        rm "$filename"
    fi 
done
4 голосов
/ 01 июня 2009

Немного поиграл с ответом от 0x6adb015. Это работает для меня:

LINES=10
for f in *.txt; do
  a=`cat "$f" | wc -l`;
  if [ "$a" -ne "$LINES" ]
  then
    rm -f "$f"
  fi
done
3 голосов
/ 01 июня 2009

Этот лайнер также должен делать

 find -name '*.txt' | xargs  wc -l | awk '{if($1 > 1000 && index($2, "txt")>0 ) print $2}' | xargs rm

В приведенном выше примере файлы размером более 1000 строк удаляются.

Выберите> и <и количество строк соответственно. </p>

1 голос
/ 01 июня 2009

Мое затирание в командной строке довольно ржавое, но я думаю, что-то подобное будет работать безопасно (замените «10» на любое количество строк в grep), даже если в ваших именах файлов есть пробелы. Отрегулируйте по мере необходимости. Вам нужно настроить его, если возможны переводы строк в именах файлов.

find . -name \*.txt -type f -exec wc -l {} \; | grep -v "^10 .*$" | cut --complement -f 1 -d " " | tr '\012' '\000' | xargs -0 rm -f
1 голос
/ 01 июня 2009

Попробуйте скрипт bash:

LINES=10
for f in *.txt; do 
  if [ `cat "$f" | wc -l` -ne $LINES ]; then 
     rm -f "$f"
  fi
done

(не проверено)

РЕДАКТИРОВАТЬ: Используйте канал для подачи в wc, так как wc также печатает имя файла.

0 голосов
/ 04 марта 2016

Немного поздно, так как вопрос был задан. У меня просто был тот же вопрос, и вот что пришло в голову: Чед Кэмпбелл

find $DIR -name '*.txt' -exec wc -l {} \; | grep -v "$LINES" | awk '{print $2}' | xargs rm
  • Первая часть ищет все файлы в DIR, оканчивающиеся на * .txt, и печатает количество строк.
  • Вторая часть выбрать все файлы, которые не имеют необходимые количество строк (ЛИНИЙ).
  • Третья часть печатает только имена файлов.
  • И четвертая часть удаляет эти файлы.
0 голосов
/ 18 ноября 2015

Вот вариант с одним вкладышем. RLINES - количество строк для удаления.

rm \`find $DIR -type f -exec wc -l {} \; | grep "^$RLINES " | awk '{print $2}'\`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...