Bagaimana cara menggunakan 'temukan' untuk mencari file yang dibuat pada tanggal tertentu? [Tutup]

254

Bagaimana cara menggunakan perintah UNIX finduntuk mencari file yang dibuat pada tanggal tertentu?

sverrejoh
sumber
8
Sepertinya pertanyaan skrip bash diizinkan.
Alan
@MichaelScheper: Saya bahkan tidak tahu harus mulai dari mana dengan komentar itu.
Lightness Races in Orbit
1
@Notinlist: Inilah jawabannya: meta.stackexchange.com/questions/10249/... Sayangnya, ternyata batas waktu telah kedaluwarsa. Sayang sekali, karena pencarian web masih mendarat di sini, dan jawaban yang diterima sangat membantu bagi banyak orang.
Michael Scheper
@MichaelScheper: Jika Anda dapat menemukan opsi untuk memilih untuk bermigrasi ke unix.stackexchange.com, dengan segala cara arahkan saya ke sana. Karena Anda tidak memiliki perwakilan untuk melihat dialog tutup, saya akan memberi Anda petunjuk: tidak ada. Pertimbangkan untuk tidak terlalu agresif ketika Anda tidak tahu apa yang Anda bicarakan. Terima kasih atas perhatian anda
Lightness Races in Orbit
5
@LightnessRacesinOrbit: Saya minta maaf karena tampil sebagai 'agresif'. Saya tidak diizinkan mengedit komentar saya, tetapi untuk referensi di masa mendatang, apakah komentar saya memuji pertanyaan yang menyinggung Anda? Saya harus mengatakan, saya merasa agak buta, bahkan setelah memberikan komentar Anda sebelumnya tentang keraguan. Saya sebenarnya berusaha lebih konstruktif daripada menambahkan 'saya juga' yang lain, dengan mencari cara kerja migrasi: meta.stackexchange.com/a/10250/249555 Batas waktu 60 hari menyembunyikan opsi itu, mungkin? Maaf untuk gelandangan mengarahkan. Sekali lagi terima kasih — dengan tulus — atas waktu dan perhatian Anda.
Michael Scheper

Jawaban:

323

Seperti yang ditunjukkan oleh Max, Anda tidak bisa, tetapi memeriksa file yang dimodifikasi atau diakses tidak terlalu sulit. Saya menulis tutorial tentang ini, hingga hari ini. Inti dari yang digunakan -newerXYdan ! -newerXY:

Contoh: Untuk menemukan semua file yang dimodifikasi pada tanggal 7 Juni 2007:

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

Untuk menemukan semua file yang diakses pada 29 September 2008:

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

Atau, file yang izinnya berubah pada hari yang sama:

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

Jika Anda tidak mengubah izin pada file, 'c' biasanya akan sesuai dengan tanggal pembuatan.

Arve
sumber
7
Versi find saya (GNU 4.2.32) tampaknya tidak mendukung predikat -newerXY. Apakah diperlukan versi minimum tertentu? Atau itu kasus kompilasi find dengan switch configure khusus?
yukondude
1
@yukondude: Anda benar. Versi find yang saya miliki secara lokal - GNU 4.4.0 - memilikinya, sementara 4.1.20 yang saya miliki di Dreamhost tidak. Namun, kludge dengan membuat dua file juga bisa digunakan.
Arve
1
Pada beberapa sistem (FreeBSD, OS / X ...) -newerBtakan cocok dengan waktu kelahiran (pembuatan) file .
Stephane Chazelas
3
Perhatikan bahwa -newerxttersedia di FreeBSD sejak tahun 2001 (di mana pertama kali disediakan sebagai tambalan pada tahun 1998), beberapa BSD dan GNU lainnya ditemukan (sejak 4.3.3 pada tahun 2007), berdasarkan temuan HP / UX, yang diperkenalkan -newerXY(tetapi di mana Y == t tidak didukung).
Stephane Chazelas
Menggunakan: find (GNU findutils) 4.4.0, sintaks ini tidak berfungsi pada SUSE ext3, jika itu seharusnya membuat daftar file / w mtime pada tanggal itu, ia tidak menghasilkan apa
niken
68

find location -ctime time_period

Contoh time_ period:

  • Lebih dari 30 hari yang lalu: -ctime +30

  • Kurang dari 30 hari yang lalu: -ctime -30

  • Tepat 30 hari yang lalu: -ctime 30

Chris
sumber
7
Masalahnya adalah saya ingin menguji untuk tanggal tertentu, bukan dalam periode waktu.
sverrejoh
1
Jadi cari tahu berapa hari yang lalu dan gunakan nomor itu.
jmanning2k
15
ctimetidak ada hubungannya dengan waktu pembuatan , itu waktu perubahan inode.
Stephane Chazelas
47

Ini dua langkah tapi saya suka melakukannya dengan cara ini:

Pertama buat file dengan tanggal / waktu tertentu. Dalam hal ini, file adalah 2008-10-01 pada tengah malam

touch -t 0810010000 /tmp/t

Sekarang kita dapat menemukan semua file yang lebih baru atau lebih tua dari file di atas (berdasarkan tanggal modifikasi file. Anda juga dapat menggunakan -anewer untuk diakses dan -cnewer status file berubah).

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

Anda juga dapat melihat file di antara tanggal tertentu dengan membuat dua file dengan sentuhan

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

Ini akan menemukan file antara dua tanggal & waktu

find / -newer /tmp/t1 -and -not -newer /tmp/t2
Mark Biek
sumber
3
+1 untuk solusi bagi yang lebih tua findyang kurang-newerXY
Felipe Alvarez
1
IMO, sekarang ini harus menjadi solusi yang diterima. Saya tidak bisa menjalankan -newermt untuk menjalankan kernel 2.6.18-348.18.1.el5, apalagi kernel yang lebih baru.
DarkForce
Sama di sini, DarkForce, fungsionalitas baru tampaknya sangat sulit
niken
34

Anda bisa melakukan ini:

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

Contoh:

[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
Jeff MacDonald
sumber
Inilah yang kebanyakan orang inginkan, tetapi tidak menerima cukup upvotes !!!
sjas
2
ini mungkin tidak berfungsi jika memiliki beberapa juta file dalam satu direktori.
Dennis Nolte
3
Ada efek samping jika istilah pencarian grep ada dalam nama file.
Snorex
mywiki.wooledge.org/ParsingLs - pendekatan yang lebih baik mungkin untuk mencetak tanggal pembuatan dalam bentuk yang dapat dibaca mesin, mungkin dengan statjika Anda tidak punya find -printf.
tripleee
12

Kamu tidak bisa Saklar -c memberi tahu Anda ketika izin terakhir diubah, -a menguji waktu akses terbaru, dan -m menguji waktu modifikasi. Sistem file yang digunakan oleh sebagian besar rasa Linux (ext3) tidak mendukung catatan "waktu pembuatan". Maaf!

Max Cantor
sumber
7
Sebenarnya, ini bukan hanya tipe sistem berkas - tidak ada antarmuka sistem untuk mendapatkan informasi tersebut, bahkan jika sistem berkas menahannya. Salah satu kekurangan Unix adalah kembali ke hari-hari awal, itulah sebabnya Unix tidak akan pernah lepas landas.
chrisdowney
1
Unix tidak akan pernah lepas landas?
lucid_dreamer
8

@ Max: benar tentang waktu pembuatan.

Namun, jika Anda ingin menghitung hari argumen berlalu untuk salah satu -atime, -ctime, -mtimeparameter, Anda dapat menggunakan ekspresi berikut

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

Ganti "2008-09-24" dengan tanggal apa pun yang Anda inginkan dan ELAPSED_DAYS akan ditetapkan ke jumlah hari antara saat itu dan hari ini. (Perbarui: kurangi satu dari hasil untuk menyelaraskan dengan findpembulatan tanggal.)

Jadi, untuk menemukan file yang dimodifikasi pada 24 September 2008, perintahnya adalah:

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

Ini akan berfungsi jika versi findAnda tidak mendukung -newerXYpredikat yang disebutkan dalam jawaban @Arve:.

Yukondude
sumber
2

Dengan sakelar -atime, -ctime, dan -mtime untuk ditemukan, Anda bisa mendekati apa yang ingin Anda capai.

ayaz
sumber
-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
Tintin
sumber
1
Mengapa Anda menyalin file? Selain perintah yang sedang `ls ...`bekerja, itu tidak menggunakan findalat.
Yamaneko
-5

Saya menemukan skrip ini dalam skrip yang menghapus semua file yang lebih lama dari 14 hari:

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

Saya pikir sedikit tambahan "man find" dan mencari parameter -ctime / -atime dll. Akan membantu Anda di sini.

Georgi
sumber