temukan tidak berfungsi di jalur yang disinkronkan?

15

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 findtidak melakukan pencarian di sana, dan saya tidak tahu apa-apa sekarang.

Ini hanya berfungsi jika saya cd $HOME/MySymlinkedPathpertama 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/MySymlinkedPathdan 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 finddan 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.

Aquarius Power
sumber
1
Saya menemukan jawaban yang lebih baik "find -follow". stackoverflow.com/questions/105212/…
Jarod
@Jarod man page mengatakan -follow sudah usang dan kita harus menggunakan -L (itu juga --follow) seperti pada jawaban saya di bawah ini:>
Aquarius Power

Jawaban:

20

Inilah jawabannya. Tapi pertanyaan itu menunjuk ke bash sebagai target masalah.

Penjelasannya adalah findtemuan itu "$HOME/MySymlinkedPath". Itu adalah tautan simbolis, bukan direktori, jadi keturunan rekursif berhenti di sana. Jika ekspresi cocok "$HOME/MySymlinkedPath"(misalnya, dalam find "$HOME/MySymlinkedPath" -name 'My*'), maka findakan mencetaknya sebagai pasangan.

Seperti yang ditunjukkan di sana, saya menemukan bahwa cara termudah / terbersih untuk menghadapinya dan memperbaiki semua skrip adalah, alih-alih:

find "$HOME/MySymlinkedPath" -name "run*.sh"

cukup tambahkan garis miring, sehingga finddimulai bukan dari tautan simbolik tetapi dari target tautan simbolik:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

Atau, berikan -Hopsi ke find(perhatikan bahwa itu harus didahulukan, sebelum jalur) untuk memberitahu itu untuk melintasi tautan simbolik yang dilewati pada baris perintahnya. (Ini berbeda dari -Lyang memberitahu finduntuk melintasi tautan simbolik yang ditemui selama keturunan rekursif juga.)

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

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 menambahkan 2>/dev/null; dan juga memutuskan untuk membuat alias ini alias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null
Aquarius Power
sumber
2
IMHO, itu umumnya praktik yang baik untuk menggunakan garis miring setelah direktori untuk menunjukkan bahwa mereka sebenarnya direktori. :) Membuat hal-hal lebih mudah dibaca, dll.
dannysauer