Vorrei ridurre un grande database dalla riga di comando a N file, molto simile a Questo la domanda fa. L'unica differenza è che la maggior parte dei miei file sono in sottodirectory, quindi mi chiedevo se c'era una soluzione rapida al mio problema o se avrebbe richiesto un'azione più approfondita. Attualmente, il mio comando sembra (con il (N+1) sostituito con il numero appropriato):
find . -type f | sort -R | tail -n +(N+1) | xargs rm
Originariamente pensavo che avrebbe funzionato perché la ricerca per natura è ricorsiva, e quindi ho provato ad aggiungere il -r (bandiera ricorsiva) intorno al rm poiché l'output indica che seleziona casualmente i file ma non li trova da eliminare. Qualche idea?
MODIFICARE: Il mio nuovo comando ha questo aspetto:
find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 rm
e ora ho l'errore che dice rm: missing operand. Inoltre, sono su una macchina CentOS quindi -z la bandiera non è disponibile per me.
MODIFICA # 2 Questo comando esegue:
find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 -r rm
ma quando eseguo a find . -type f | wc -l per ottenere il numero di file nella directory (che dovrebbe essere N se il comando ha funzionato correttamente) non è cambiato dalla quantità iniziale di file.
-print0, dovresti dichiararlo chiaramente perché (secondo me) questa è l'unica cosa che rende la tua domanda non un duplicato di quella collegata. Quindi dovresti anche menzionare esplicitamente l'incapacità di usare -z (con sort? tail? tutti e due?).
-print0ma molte delle soluzioni correlate che ho visto l'hanno usato. Nella domanda che ho originariamente collegato, ho visto le soluzioni con e senza di esso e quindi l'ho provato in entrambi i modi.
sortné semplicetailfunziona con stringhe con terminazione nulla come vuoi tu.