Come usare 'trova' per cercare i file creati in una data specifica? [chiuso]


254

Come si usa il comando UNIX findper cercare i file creati in una data specifica?


8
Sembra che le domande di scripting bash siano consentite.
Alan,

@MichaelScheper: non so nemmeno da dove cominciare con quel commento.
Corse di leggerezza in orbita

1
@Notinlist: ecco la risposta: meta.stackexchange.com/questions/10249/… Sfortunatamente, risulta che è scaduto un limite di tempo. Peccato, dato che le ricerche sul web continuano ad arrivare qui e la risposta accettata è stata utile per molte persone.
Michael Scheper,

@MichaelScheper: se riesci a trovare un'opzione per votare per migrare su unix.stackexchange.com, indicamelo. Dato che non hai il rappresentante per vedere la finestra di dialogo chiusa, ti darò un suggerimento: non ce n'è uno. Considera di essere meno combattivo quando non hai idea di cosa stai parlando. Grazie per l'attenzione.
Razze di leggerezza in orbita,

5
@LightnessRacesinOrbit: mi scuso per essermi imbattuto in "combattivo". Non sono autorizzato a modificare i miei commenti, ma per riferimento futuro, è stato il mio commento a lodare la domanda che ti ha offeso? Devo dire che mi sento un po 'cieco, anche dopo aver dato al tuo commento precedente il beneficio del dubbio. In realtà stavo cercando di essere più costruttivo dell'aggiunta di un altro "anch'io", osservando come funziona la migrazione: meta.stackexchange.com/a/10250/249555 Il limite di 60 giorni nasconde quell'opzione , forse? Ci scusiamo per il barbone. Grazie ancora - sinceramente - per il tuo tempo e la tua attenzione.
Michael Scheper,

Risposte:


323

Come sottolineato da Max, non puoi, ma controllare i file modificati o accessibili non è poi così difficile. Ho scritto un tutorial su questo, fino ad oggi. La cui essenza è usare -newerXYe ! -newerXY:

Esempio: per trovare tutti i file modificati il ​​7 giugno 2007:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

Per trovare tutti i file accessibili il 29 settembre 2008:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

Oppure, i file che hanno avuto il loro permesso sono cambiati lo stesso giorno:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Se non si modificano le autorizzazioni per il file, 'c' normalmente corrisponderebbe alla data di creazione.


7
La mia versione di find (GNU 4.2.32) non sembra supportare i predicati -newerXY. È necessaria una versione minima particolare? Oppure si tratta di compilare find con uno speciale switch di configurazione?
yukondude,

1
@yukondude: hai ragione. La versione di find che ho localmente - GNU 4.4.0 - ce l'ha, mentre la 4.1.20 che ho su Dreamhost no. Tuttavia, il kludge con la creazione di due file dovrebbe funzionare in entrambi.
Arve,

1
Su alcuni sistemi (FreeBSD, OS / X ...) -newerBtcorrisponderanno al momento della nascita (creazione) del file .
Stephane Chazelas,

3
Nota che -newerxtè disponibile su FreeBSD dal 2001 (dove è stato fornito per la prima volta come patch nel 1998), alcuni altri BSD e GNU trovano (dal 4.3.3 nel 2007), basato su HP / UX find, che ha introdotto -newerXY(ma dove Y == t non è supportato).
Stephane Chazelas,

Usando: find (GNU findutils) 4.4.0, questa sintassi non funziona su SUSE ext3, se dovrebbe elencare file / w mtime in quella data, non restituisce nulla
niken,

68

find location -ctime time_period

Esempi di time_period:

  • Più di 30 giorni fa: -ctime +30

  • Meno di 30 giorni fa: -ctime -30

  • Esattamente 30 giorni fa: -ctime 30


7
Il problema è che voglio provare per una data specifica, non entro un periodo di tempo.
sverrejoh,

1
Quindi scopri quanti giorni fa e usa quel numero.
jmanning2k,

15
ctimenon ha nulla a che fare con il tempo di creazione , è il tempo di cambio dell'inode.
Stephane Chazelas,

47

Sono due passaggi ma mi piace farlo in questo modo:

Innanzitutto crea un file con una data / ora particolare. In questo caso, il file è 01/10/2008 a mezzanotte

touch -t 0810010000 /tmp/t

Ora possiamo trovare tutti i file più recenti o più vecchi del file sopra (andando per data di modifica del file. Puoi anche usare -anewer per l'accesso e -cnewer lo stato del file è cambiato).

find / -newer /tmp/t
find / -not -newer /tmp/t

Puoi anche guardare i file tra determinate date creando due file con il tocco

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

Questo troverà i file tra le due date e orari

find / -newer /tmp/t1 -and -not -newer /tmp/t2

3
+1 per la soluzione a un anziano findche manca-newerXY
Felipe Alvarez

1
IMO, in questo momento questa dovrebbe essere la soluzione accettata. Non sono riuscito a far funzionare -newermt sul kernel 2.6.18-348.18.1.el5, per non parlare dei kernel più recenti.
DarkForce,

Lo stesso qui DarkForce, la nuova funzionalità sembra essere molto traballante
niken,

34

Potresti farlo:

find ./ -type f -ls |grep '10 Sep'

Esempio:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24

Questo è ciò che la maggior parte delle persone desidera, ma non ha ricevuto abbastanza voti !!!
sjas,

2
questo potrebbe non funzionare con alcuni milioni di file in una directory.
Dennis Nolte,

3
Ci sono effetti collaterali se il termine di ricerca grep è nel nome del file.
Snorex,

mywiki.wooledge.org/ParsingLs - un approccio migliore è probabilmente quello di stampare la data di creazione in forma leggibile da una macchina, magari con statse non ce l'hai find -printf.
tripleee

12

Non puoi. L'opzione -c indica quando sono state modificate le autorizzazioni l'ultima volta, -a verifica il tempo di accesso più recente e -m verifica il tempo di modifica. Il filesystem utilizzato dalla maggior parte delle versioni di Linux (ext3) non supporta un record "tempo di creazione". Scusa!


7
In realtà, non è solo il tipo di filesystem - non esiste un'interfaccia di sistema per ottenere tali informazioni, anche se il filesystem le conteneva. Una delle carenze di Unix che risale ai primi giorni, motivo per cui Unix non decollerà mai.
chrisdowney,

1
Unix non decollerà mai?
lucid_dreamer,

8

@Max: ha ragione sui tempi di creazione.

Tuttavia, se si vuole calcolare l'argomento giorni trascorsi per una delle -atime, -ctime, -mtimei parametri, è possibile utilizzare la seguente espressione

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Sostituisci "2008-09-24" con la data che desideri e ELAPSED_DAYS verrà impostato sul numero di giorni tra allora e oggi. (Aggiornamento: sottrarre uno dal risultato per allinearlo con findl'arrotondamento della data.)

Quindi, per trovare qualsiasi file modificato il 24 settembre 2008, il comando sarebbe:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Questo funzionerà se la tua versione di findnon supporta i -newerXYpredicati citati nella risposta di @Arve :.


2

Con gli interruttori -atime, -ctime e -mtime da trovare, puoi avvicinarti a ciò che vuoi ottenere.


-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

1
Perché stai copiando i file? Oltre al comando in `ls ...`works, non utilizza lo findstrumento.
Yamaneko,

-5

Ho trovato questo script in uno script che elimina tutti i file più vecchi di 14 giorni:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Penso che un po '"man find" aggiuntivo e la ricerca dei parametri -ctime / -atime ecc. Ti aiuteranno qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.