2009-06-01 4 views

Antwort

1

diesen Bash-Skript Versuchen:

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

(Nicht geprüft)

EDIT: Verwenden Sie ein Rohr in wc zu füttern, wie WC druckt auch die Dateinamen.

+0

Funktioniert hier nicht: "Zeile 3: [: zu viele Argumente" – schnaader

+0

Ich habe auch versucht, dies zu tun: a = "wc-l" $ f'; wenn ["$ a" -ne $ LINES]; Dies würde funktionieren, aber wc -l gibt die Anzahl und den Dateinamen aus ... – schnaader

+0

+1, da dies der Prototyp meiner Antwort war :) – schnaader

4

Gespielt ein bisschen mit der Antwort von 0x6adb015. Das funktioniert für mich:

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

Auch die Datei auf "cat" umgestellt. – schnaader

11

Dieses Bash-Skript sollte den Trick tun. Speichern Sie als "rmlc.sh".

Verwendungsbeispiel:

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 

Beachten Sie, dass, wenn das rmlc.sh Skript im aktuellen Verzeichnis ist, es vor dem Löschen geschützt ist.


#!/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 - Sehr gut, vollständige und gut dokumentierte Skript – schnaader

+1

Mein einziges Problem mit diesem ist die "unentgeltliche Verwendung von cat". Wc -l kann auf eine Datei alle durch selbst: wc -l "$ filename" ist alles was du brauchst. –

+2

Harper: Ich habe ursprünglich "wc -l" selbst probiert. Das Problem ist, dass die Ausgabe den Dateinamen und nicht nur die Zeilennummer enthält. Beispiel: "wc - l rmlc.sh "gibt" 48 rmlc.sh "aus, während" echo rmlc.sh | wc -l "gibt einfach" 48 "aus. –

1

Maischen Meine Kommandozeile ist ziemlich rostig, aber ich denke, so etwas wie dies sicher funktioniert (die „10“ auf die Anzahl der Zeilen in der grep was auch immer aus), auch wenn Ihre Dateinamen Leerzeichen in ihnen . Passen Sie wie erforderlich an. Sie müssen es optimieren, wenn neue Zeilen in Dateinamen möglich sind.

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

Danke Simon, sowohl Ihre Befehlszeile und Kevins Skript funktionieren perfekt, obwohl ich mehr als 4 000 Dateien habe :) – Daniel

3

Dieses Motto sollte auch tun

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

In dem obigen Beispiel Dateien, die größer als 1000 Zeilen gelöscht werden.

Wählen Sie> und < und die Anzahl der Zeilen entsprechend.

+0

Verwenden Sie xargs -0, wenn Dateinamen Leerzeichen enthalten können. – Sathya

0

Hier ist eine Einliner-Option. RLINES ist die Anzahl der Zeilen, die zum Entfernen verwendet werden.

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

Ein bisschen spät, seit die Frage gestellt wurde. Ich hatte gerade die gleiche Frage, und das ist, was ein aufkam, in den Linien der Chad Campbell

find $DIR -name '*.txt' -exec wc -l {} \; | grep -v "$LINES" | awk '{print $2}' | xargs rm 
  • Erster Teil für alle Dateien in DIR sieht in * .txt und Druck endet die Anzahl der Linien.
  • Zweiter Teil wählen Sie alle Dateien, die nicht haben die erforderliche Anzahl der Zeilen (LINES).
  • Der dritte Teil druckt nur die Dateinamen.
  • Und der vierte Teil löscht diese Dateien.
Verwandte Themen