Menemukan nama file tanpa direktori

3

Bagaimana saya bisa menggunakan find untuk menemukan file tanpa direktori sebelumnya (./) dengan cara yang juga berfungsi dengan -exec?

Tujuan saya adalah untuk melihat log Apache untuk melihat apakah ada file yang telah diakses baru-baru ini. Inilah yang saya miliki sejauh ini:

find . -max-depth 1 -type d \
  -exec grep \"GET /{}\" /var/log/apache2/blah.com \;

Saya menemukan solusi menggunakan -printf "% f \ n", tetapi itu tidak bekerja dengan -exec.

Luke
sumber
Seharusnya -maxdepth, bukan -max-depth
Xiè Jìléi

Jawaban:

2
find . -maxdepth 1 -type d -printf "%f\0" | \
     xargs -0 -I {} grep 'GET /{}' /var/log/apache2/blah.com
Dennis Williamson
sumber
2

Mencoba:

grep -Ff <(find . -maxdepth 1 -type d | sed -e 's,^\.,GET ,') /var/log/apache2/blah.com

Atau, jika Anda ingin mengganti {} di dalamnya find perintah:

find . -maxdepth 1 -type d -exec bash -c 'F={}; F=${F#./}; grep -F "GET /$F" /var/log/apache2/blah.com' \;
Xiè Jìléi
sumber
0

Karena Anda tidak melakukan pencarian rekursif, tidak perlu menggunakan find, kecuali Anda hanya ingin memasukkan direktori dan bukan tautan simbolik ke direktori. Dengan asumsi tidak ada direktori yang namanya dimulai dengan titik (jika ada, gunakan for x in .*/ */; do … ), berikut ini akan mencari nama semua direktori dan tautan simbolik ke direktori di direktori saat ini:

for x in */; do grep -F "GET /${x%/}" /var/log/apache2/blah.com; done

Jika Anda melakukan pencarian rekursif, Anda dapat menghindari titik terkemuka dengan mencari dari * daripada . (komentar yang sama seperti di atas mengenai nama yang dimulai dengan titik).

find * -type d -exec grep -F "GET /${x%/}" /var/log/apache2/blah.com

Kemungkinan lain adalah untuk memposting output dari find. Ini sangat berguna dalam kombinasi dengan kemampuan grep untuk mencari beberapa pola yang dipisahkan oleh baris baru.

grep -F "$(find . -type d | sed -e 's!^\.!GET !')" /var/log/apache2/blah.com

Perhatikan bahwa dalam semua kasus Anda mengasumsikan tidak ada karakter dalam nama direktori yang akan lolos dalam log Apache. Ini dapat dipecahkan dengan postprocessing sedikit lebih lanjut dari find keluaran.

Gilles
sumber