Jika saya menjalankan perintah ini find $HOME/MySymlinkedPath -name "run*.sh"
tidak ada yang terjadi, dan tidak memberikan kesalahan ('MySymlinkedPath' adalah jalur yang terhubung ke hard drive lain selain $ HOME saya satu).
Ini juga gagal:
find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"
Dan hanya untuk memastikan, jalur yang tidak ada ini gagal (tentu saja) find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"
sehingga jalur tersebut ditemukan (karena kesalahan itu tidak terjadi) tetapi find
tidak melakukan pencarian di sana, dan saya tidak tahu apa-apa sekarang.
Ini hanya berfungsi jika saya cd $HOME/MySymlinkedPath
pertama dan menghapus referensi jalur seperti ini find -name "run*.sh"
tetapi itu tidak baik untuk skrip saya.
Info tambahan :
perintah ini berfungsi seperti biasa ls $HOME/MySymlinkedPath/run*.sh
, dan jika saya pergi ke sana cd $HOME/MySymlinkedPath
dan menjalankannya ls ..
, hasilnya tidak seperti yang saya harapkan - daftar jalur tempat jalur yang disinkronkan berada - ia mengembalikan daftar jalur nyata di media / harddisk lain !!!
pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath
Berpikir ulang :
Apakah ini masalah dengan find
dan ls
, atau dengan sistem saya? atau memang diharapkan dan bukan masalah sama sekali ?? Saya di Ubuntu 12.10. Gagal pada semua terminal yang saya uji sehingga sepertinya bukan "masalah" terminal.
Jawaban:
Inilah jawabannya. Tapi pertanyaan itu menunjuk ke bash sebagai target masalah.
Penjelasannya adalah
find
temuan itu"$HOME/MySymlinkedPath"
. Itu adalah tautan simbolis, bukan direktori, jadi keturunan rekursif berhenti di sana. Jika ekspresi cocok"$HOME/MySymlinkedPath"
(misalnya, dalamfind "$HOME/MySymlinkedPath" -name 'My*'
), makafind
akan mencetaknya sebagai pasangan.Seperti yang ditunjukkan di sana, saya menemukan bahwa cara termudah / terbersih untuk menghadapinya dan memperbaiki semua skrip adalah, alih-alih:
cukup tambahkan garis miring, sehingga
find
dimulai bukan dari tautan simbolik tetapi dari target tautan simbolik:Atau, berikan
-H
opsi kefind
(perhatikan bahwa itu harus didahulukan, sebelum jalur) untuk memberitahu itu untuk melintasi tautan simbolik yang dilewati pada baris perintahnya. (Ini berbeda dari-L
yang memberitahufind
untuk melintasi tautan simbolik yang ditemui selama keturunan rekursif juga.)Dan akhirnya itu bekerja dengan baik di sini
-L
(karena beberapa filesystem saya telah terhubung melalui folder). Tapi itu menghasilkan banyak pesan kesalahan yang tidak bermasalah jadi saya menambahkan2>/dev/null
; dan juga memutuskan untuk membuat alias inialias find='find -L'
:sumber