Wie können Sie Dateien in einem Verzeichnis entfernen, die mehr oder weniger Zeilen als angegeben haben (alle Dateien haben das Suffix ".txt")?Linux: Löschen von Dateien, die keine bestimmte Anzahl von Zeilen enthalten
Antwort
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.
Funktioniert hier nicht: "Zeile 3: [: zu viele Argumente" – schnaader
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
+1, da dies der Prototyp meiner Antwort war :) – schnaader
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
Auch die Datei auf "cat" umgestellt. – schnaader
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
+1 - Sehr gut, vollständige und gut dokumentierte Skript – schnaader
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. –
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. –
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
Danke Simon, sowohl Ihre Befehlszeile und Kevins Skript funktionieren perfekt, obwohl ich mehr als 4 000 Dateien habe :) – Daniel
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.
Verwenden Sie xargs -0, wenn Dateinamen Leerzeichen enthalten können. – Sathya
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}'\`
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.
- 1. Löschen von Zeilen, die duplizierte Zeichenfolgen enthalten
- 2. Batch löschen bestimmte Zeilen von Absätzen in .srt-Dateien
- 3. Wie lösche ich alle Zeilen, die mehr als eine bestimmte Anzahl von Buchstaben enthalten?
- 4. Entfernen Sie Zeilen, die bestimmte Zeichenfolge enthalten
- 5. Erhalten Sie Ordner, die eine bestimmte Anzahl von Verzeichnissen enthalten
- 6. UNIX - bestimmte Zeilen löschen
- 7. jQuery zum Ausblenden von Zeilen, die keine bestimmte Klasse haben
- 8. Linux-Server, Suchen von Dateien mit nur 4 spezifischen Zeilen
- 9. Löschen von Zeilen, die bestimmte Bedingungen erfüllen in R
- 10. Löschen bestimmte Zeilen in einer Gruppe von Zeilen in R
- 11. Die höchste Anzahl für bestimmte Zeilen erhalten
- 12. Wie finde ich Zeilen, die eine Zeichenfolge in Linux enthalten
- 13. Löschen doppelte Zeilen in zwei Satz ausgerichtete Dateien, Linux
- 14. DOS Batch FOR Schleife zum Löschen von Dateien, die keine Zeichenfolge enthalten
- 15. Ordner löschen und Dateien enthalten
- 16. Excel VBA Löschen von Zeilen, wenn Zellen Werte enthalten
- 17. MySQL - Wie paginiert man durch eine bestimmte Anzahl von Zeilen?
- 18. Wie listet ich die Anzahl der Zeilen für viele x Anzahl von CSV-Dateien auf?
- 19. Auswählen und Löschen von duplizierten Zeilen für bestimmte Spalten SQL
- 20. Bash - Abrufen von Zeilen aus Dateien, die kein spezifisches Muster enthalten
- 21. Rbind/Anfügen von zwei Listen, die Datenrahmen mit gleichen Spalten aber unterschiedlicher Anzahl von Zeilen enthalten
- 22. Entfernen Farbcode von Linux-Dateien
- 23. Plotten bestimmte Anzahl von Tagen von einem csv in Python
- 24. Löschen von Zeilen in numpy Array
- 25. Löschen von NaN-Zeilen, bestimmte Spalten in bestimmten Excel-Dateien mit glob/merge
- 26. Suchen Sie eine bestimmte Zeile in einer Datei basierend auf Benutzereingaben und löschen Sie eine bestimmte Anzahl von Zeilen
- 27. Gradle: Löschen von Dateien älter als eine bestimmte Zeit
- 28. Linux-Shell-Skript zum Löschen alter Dateien von FTP
- 29. Löschen von .rbenv unter Linux
- 30. Unix - extrahiere Dateien mit einer bestimmten Anzahl von Zeilen
gehört auf http://serverfault.com –
Warum sollte es? Linux wird nicht nur auf Servern verwendet ... – schnaader
mit schnaader vereinbart –