Come rimuovere file all'interno di una directory con più o meno righe di quelle specificate (tutti i file hanno il suffisso ".txt")?Linux: elimina i file che non contengono un numero specifico di righe
risposta
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.
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
Passato a "cat" anche il file. – schnaader
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
+1 - Script molto buono, completo e ben documentato – schnaader
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 –
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 ". –
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
Grazie Simon, sia la tua riga di comando che lo script di Kevin funzionano perfettamente, anche se ho più di 4000 file :) – Daniel
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.
Usa xargs -0 se il nome file può contenere spazio. – Sathya
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}'\`
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.
- 1. Escludere le directory in find che non contengono un nome file specifico?
- 2. Lotto elimina un numero elevato di file
- 3. righe di eliminazione sed che non contengono una stringa specifica
- 4. Elimina righe vuote da un file
- 5. Verifica se i bambini contengono un testo specifico con jQuery
- 6. Deadlock su MySQL che elimina le righe
- 7. Elenca tutti i file che non iniziano con un numero
- 8. Rimuovere le righe che contengono non in lingua inglese (ASCII) caratteri da un file
- 9. Linux: rimozione di file che non contengono tutte le parole specificate
- 10. Come trovare file di testo che non contengono testo su Linux?
- 11. Google BigQuery Elimina righe?
- 12. Numero di righe in un file CSV
- 13. Rsync esclude tutte le directory che contengono un file con un nome specifico
- 14. Come grep per le righe che contengono parole particolari in un file di registro?
- 15. Nascondere tutte le righe della tabella dopo un numero specifico?
- 16. Come trovare i tweet che contengono un URL?
- 17. Elimina elemento specifico dall'array
- 18. Selezionare solo un numero specifico di righe che soddisfano una condizione
- 19. xlwt che limita il numero di righe
- 20. Elimina righe duplicate (non cancella tutti i duplicati)
- 21. Trova file che non contengono la stringa selezionata
- 22. Elimina le prime X righe da un file PHP
- 23. Sqlite: come eliminare le righe che contengono stringhe null/vuote
- 24. Combobox JavaFX che non aggiorna il numero di righe visibili
- 25. Elimina alcune righe in un gruppo di righe in R
- 26. Hg - Trova i tag che "coprono" il file specifico versione
- 27. Elimina righe vuote
- 28. Restrizioni OWL: definizione di classi che contengono solo proprietà con un valore di proprietà specifico
- 29. Come rimuovere tutte le righe in un numpy.ndarray che contengono valori non numerici
- 30. Come utilizzare grep per trovare tutti i file che contengono un pattern ma non hanno un secondo?
appartiene a http://serverfault.com –
Perché dovrebbe? Linux non è usato solo sui server ... – schnaader
concordato con lo schnaader –