2009-06-01 10 views

risposta

1

Prova questa script bash:

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

(non testato)

EDIT: utilizzare un tubo per alimentare nel wc, come stampe wc il nome del file pure.

+0

Non funziona qui: "riga 3: [: troppi argomenti" – schnaader

+0

Ho anche provato a farlo: a = 'wc -l" $ f'; se ["$ a" -ne $ LINES]; funziona, ma wc -l emette il conteggio e il nome file ... – schnaader

+0

+1, poiché questo era il prototipo della mia risposta :) – schnaader

4

Riprodotto un po 'con la risposta da 0x6adb015. Questo funziona per me:

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

Passato a "cat" anche il file. – schnaader

11

Questo script di bash dovrebbe fare il trucco. Salva come "rmlc.sh".

utilizzo Esempio:

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 

Si noti che se lo script rmlc.sh si trova nella directory corrente, è protetta contro la cancellazione.


#!/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 
+2

+1 - Script molto buono, completo e ben documentato – schnaader

+1

Il mio unico problema con questo è "l'uso gratuito di cat". Wc -l può operare su un file tutto da wc -l "$ nomefile" è tutto ciò che serve –

+2

Harper: Inizialmente ho provato "wc -l" da solo, il problema è che l'output include il nome file invece del solo numero di riga. Ad esempio, "wc - l rmlc.sh "restituisce" 48 rmlc.sh ", mentre" echo rmlc.sh | wc -l "emette semplicemente" 48 ". –

1

La mia linea di comando mashing è piuttosto arrugginito, ma credo che qualcosa di simile possa funzionare in modo sicuro (cambiare il "10" a qualsiasi numero di righe nel grep), anche se i nomi dei file hanno spazi in loro . Regolare secondo necessità. Dovresti modificarlo se sono disponibili nuove righe nei nomi dei file.

find . -name \*.txt -type f -exec wc -l {} \; | grep -v "^10 .*$" | cut --complement -f 1 -d " " | tr '\012' '\000' | xargs -0 rm -f 
+0

Grazie Simon, sia la tua riga di comando che lo script di Kevin funzionano perfettamente, anche se ho più di 4000 file :) – Daniel

3

Questo uno di linea dovrebbe anche fare

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

Nell'esempio di cui sopra, i file più di 1000 linee vengono eliminate.

Scegliere> e < e il numero di righe di conseguenza.

+0

Usa xargs -0 se il nome file può contenere spazio. – Sathya

0

Ecco un'opzione di un solo rivestimento. RLINES indica il numero di righe da utilizzare per la rimozione.

rm \`find $DIR -type f -exec wc -l {} \; | grep "^$RLINES " | awk '{print $2}'\` 
0

Un po 'tardi da quando è stata posta la domanda. Ho appena avuto la stessa domanda, e questo è ciò che un avvicinò con, nelle linee di Chad Campbell

find $DIR -name '*.txt' -exec wc -l {} \; | grep -v "$LINES" | awk '{print $2}' | xargs rm 
  • prima parte cerca tutti i file in DIR che terminano in * .txt e stampare il numero di Linee.
  • Seconda parte selezionare tutti i file che non hanno il numero di righe richiesto (LINEE) .
  • La terza parte stampa solo i nomi dei file.
  • E la quarta parte cancella quei file.
Problemi correlati