Ketika saya menjalankan perintah ini berfungsi:
$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst Outlook Data File Outlook Data File.sbd Trash Unsent Messages
Inbox.pst Outlook Data File.msf Sent.pst Trash.msf Unsent Messages.msf
Namun, Saat mengganti ls
dengan cd
itu tidak berfungsi:
$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory
Saya tahu cd
adalah bash
built-in, jadi saya mencoba ini yang tidak berhasil:
$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory
Bagaimana cara menggunakan cd
bersama dengan find -exec
perintah?
MEMPERBARUI
Alasan saya mencoba untuk menggunakan cd
dengan find -exec
adalah bahwa nama direktori adalah aneh yang menunjukkan pada terminal saya sebagai sesuatu seperti ????
.
bash
find
cd-command
pengguna3405291
sumber
sumber
LC_ALL=C printf '%q\n' *
mencetak nama ASCII untuk semua file di direktori Anda saat ini, satu ke satu baris (mengubah baris baru ke$'\n'
atau serupa).Jawaban:
The
-exec
pilihan untukfind
mengeksekusi sebuah utilitas eksternal, mungkin dengan beberapa opsi baris perintah dan argumen lainnya.Unix Anda tidak menyediakan
cd
utilitas eksternal, hanya sebagai shell bawaan, jadifind
gagal menjalankannya. Setidaknya MacOS dan Solaris jangan memberikancd
sebagai utilitas eksternal.Akan ada sedikit atau tidak ada gunanya untuk mengeksekusi
cd
dengan cara ini, kecuali sebagai cara untuk menguji apakah pathname ditemukan olehfind
adalah direktori di mana Anda akan dapatcd
. Direktori yang berfungsi di shell interaktif Anda (atau apa pun panggilanfind
) tidak akan berubah.Terkait:
Jika Anda mengalami masalah dengan nama direktori yang aneh atau sangat sulit untuk diketik, dan Anda ingin mengubah ke direktori itu, maka pertimbangkan untuk membuat tautan simbolis ke direktori dan kemudian
cd
ke dalamnya menggunakan tautan itu sebagai gantinya:Ini akan membuat tautan simbolis bernama
thedir
yang akan menunjuk ke direktori yang bermasalah. Anda kemudian dapat mengubah direktori kerja dengan(jika tautan ada di direktori saat ini). Ini menghindari memodifikasi direktori dengan cara apa pun. Gagasan lain adalah mengubah nama direktori dengan cara yang sama
find
, tetapi itu tidak akan dianjurkan jika program lain mengharapkan direktori memiliki nama tertentu.sumber
cd
denganfind -exec
adalah bahwa nama direktori dalam beberapa karakter aneh yang tidak muncul dengan benar pada terminal saya.cd
masuk ke direktori yang memiliki nama buruk , dan saya tidak bisacd
melakukannya dengan cara biasa./bin/cd
adalah hasil dari POSIX ( pubs.opengroup.org/onlinepubs/9699919799/utilities/... ) di mana standar bawaan harus dapat diakses oleh exec (). Tentu saja,/bin/cd
kemungkinan tidak melakukan apa yang diinginkan orang :-)find
menjalankan-exec
perintah itu sendiri, itu tidak melibatkan shell. Bahkan jika itu terjadi, perubahan direktori hanya akan bertahan sampai shell itu keluar, segera setelahcd
.Anda harus memasukkan nama file ke shell saat ini
cd
ke dalamnya. Bergantung pada seberapa buruk nama file Anda, Anda bisa menggunakan substitusi perintah:Itu tidak akan berfungsi jika nama file berakhir di baris baru, karena penggantian perintah memakan baris baru. Dalam hal ini, Anda harus melindungi baris baru dan menyingkirkan yang
find
ditambahkan saat mencetak:Atau, dengan GNU
find
, mintalah agar ia tidak mencetak baris tambahan (tetapi masih melindungi nama file):Juga menggunakan
-quit
predikat (juga ekstensi GNU), untuk berhenti mencari pertandingan pertama sebagai pengoptimalan.Atau, Anda dapat memulai shell baru dari dalam
find
, tapi agak jelek:sumber
find
menambahkan baris baru saat mencetak. Diedit.dir=$(find -print0)
masih akan membuang baris baru dari nama file ...Tidak dengan exec, tetapi ini mungkin cukup baik untuk Anda:
"-Type d", hanya untuk memastikan. Tentang apa, saya tidak begitu tahu.
sumber
mkdir $'foo\n'
bekerja dengan sempurna di sini; Saya belum melihat sistem file UNIX asli di mana itu tidak didukung.Gunakan aliran yang dibatasi NUL untuk membaca keluaran dari
find
yang berfungsi di semua kasus - termasuk nama yang diakhiri dengan baris baru. Selain itu, Anda dapat menggunakanprintf '%q'
untuk menghasilkan representasi nama file yang dapat dibaca.sumber
Jika Anda mendapatkan pesan ini, maka platform OS Anda bermasalah. Standar POSIX mengharuskan perintah yang bernama
cd
harus tersedia di sistem file sehingga dapat dipanggil viaexec()
.Sekarang berita buruk untuk Anda:
Bahkan jika platform OS Anda tidak bermasalah, Anda hanya tidak melihat peringatan, tetapi Anda tidak mendapatkan hasil yang Anda harapkan, karena itu tidak membantu Anda jika suatu program terpisah mengubah direktori kerjanya saat ini dan segera mati setelah itu.
Jika Anda ingin
cd
perintah yang efektif dijalankan olehfind
, Anda dapat melakukan sesuatu seperti:sumber
sh
, bukan sesuatu yang ingin Anda lakukan. Lebih baik untuk menghindari nilai-nilai dummy untuk skrip inline itu$0
seperti yang digunakan dalam pesan kesalahan misalnya (seperti saat itucd
akan gagal).cd "$1"
? Jika namanya sulit diketik, mungkin juga mengandung karakter meta shell ...