Secara umum, string kosong tidak menunjukkan direktori saat ini, baik untuk perintah shell maupun panggilan sistem. Itu terjadi pada beberapa sistem lama, tetapi tidak pada sistem yang sesuai dengan POSIX .
Kadang-kadang Anda akan menemukan program yang menggunakan direktori saat ini ketika Anda melewatkan string kosong dan program mengharapkan nama direktori. Ini kadang-kadang disengaja, dan kadang-kadang efek samping dari prepending path absolut direktori saat ini ketika string yang diberikan tidak dimulai dengan slash.
Hal terbaik untuk Anda adalah meninggalkan ./
. Tidak ada salahnya.
Jika daftar file untuk
find . … | sed 's!^\./!!'
Perhatikan bahwa ini mangles beberapa nama file yang mengandung baris baru. Ini biasanya bukan masalah untuk konsumsi manusia, dan output dari find
tidak cocok untuk konsumsi program karena ambigu. Jika Anda menggunakan -print0
, yang cocok untuk konsumsi program, Anda mungkin tidak peduli dengan ./
awalannya.
Anda dapat menggunakan find * …
sebagai gantinya find . …
, tetapi perhatikan bahwa find *
memiliki sejumlah cacat yang membuatnya tidak cocok secara umum:
.
dihilangkan.
- Semua file titik (file yang namanya dimulai dengan
.
atau ..`) dihilangkan.
- Jika ada nama file di direktori saat ini yang namanya dimulai dengan
-
(atau file bernama !
atau (
...), itu akan ditafsirkan sebagai opsi atau predikat oleh find
.
Poin pertama tidak masalah jika filter Anda mengecualikan direktori saat ini. Untuk poin kedua, Anda dapat menggunakan pola ..?* .[!.]* *
untuk mencocokkan semua file di direktori saat ini, tetapi Anda harus memeriksa apakah setiap pola cocok dengan setidaknya satu file dan menghilangkannya jika tidak. Ini mungkin tetapi sangat rumit. Poin terakhir adalah stopper. Jadi find *
mungkin cocok untuk penggunaan baris perintah quickie, tetapi jangan menggunakannya dalam skrip.
Pendekatan alternatif adalah dengan menggunakan fasilitas globbing rekursif shell, misalnya
printf '%s\n' **/*.h
Ini perlu diaktifkan oleh shopt -s globstar
di bash dan oleh set -o globstar
di ksh93, dan tidak ada di shell POSIX dasar seperti dasbor. File dot tidak akan dilalui secara default; untuk memasukkannya, pertama-tama buat globbing jangan abaikan file dot dengan shopt -s dotglob
di bash atau FIGNORE='@(.|..)'
di ksh93. Juga, jika tidak ada kecocokan, maka perintah ini mencetak pola; jalankan shopt -s nullglob
bash untuk mencetak baris kosong, dan gunakan pola ~(N)**/*.h
dalam ksh.
Di zsh, globbing rekursif diaktifkan secara default. Gunakan kualifikasi glob D
untuk memasukkan file titik dan N
untuk mencetak baris kosong jika tidak ada yang cocok (secara default, zsh melempar kesalahan jika suatu pola tidak cocok dengan file apa pun). Anda dapat menggunakan printf
seperti di atas atau
print -rl -- **/*.h(DN)
find
memiliki parameter -printf untuk memanipulasi bagaimana hasil ditampilkan.find . -name '*.h' -printf '%P\n'
akan menghapus./
awalan. Lihat apafind . -name '*.h' -print
.