Saya menulis skrip shell yang mengambil jalur file sebagai input.
Untuk alasan ini, saya perlu membuat daftar file rekursif dengan path lengkap. Misalnya, file tersebut bar
memiliki path:
/home/ken/foo/bar
tetapi, sejauh yang saya bisa lihat, keduanya ls
dan find
hanya memberikan daftar jalur relatif:
./foo/bar (from the folder ken)
Sepertinya persyaratan jelas, tapi aku tidak bisa melihat apa-apa di find
atau ls
manusia halaman.
Bagaimana saya bisa menghasilkan daftar file di shell termasuk jalur absolutnya?
find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Jawaban:
Jika Anda memberikan
find
path absolut untuk memulai, itu akan mencetak path absolut. Misalnya, untuk menemukan semua file .htaccess di direktori saat ini:atau jika shell Anda mengembang
$PWD
ke direktori saat ini:find
hanya menambahkan path yang diberikan ke path relatif ke file dari path itu.Greg Hewgill juga menyarankan untuk menggunakan
pwd -P
jika Anda ingin menyelesaikan symlink di direktori Anda saat ini.sumber
pwd -P
.ls -d -1 $PWD/**/*
tapi saya kirafind $PWD
juga berfungsi (diuji dalam bash)find $PWD
sederhana. Thels
mantera kompleks dan berat (kecuali jika Anda alias itu).find
tidak tergantung pada ekspansi shell glob, sehingga akan bekerja di shell apa pun.find
juga jauh lebih fleksibel, saya bisa mendapatkan daftar rekursif semua file, atau mungkin semua direktori, atau mungkin saya ingin daftar semua file xml, atau semua file berubah dalam seminggu terakhir. Semua itu mungkin denganfind
, tetapi tidak dengan mudahls
.find "`pwd`" -name .htaccess
karena spasi dalam nama direktorimemberikan jalan absolut penuh. tetapi jika file tersebut adalah symlink, Anda akan mendapatkan nama terselesaikan akhir.
sumber
realpath
sebagai gantinyabrew install coreutils
, maka executable akan diinstal sebagai/usr/local/opt/coreutils/libexec/gnubin/readlink
Gunakan ini untuk dirs (
/
setelah**
ini diperlukan di bash untuk membatasi ke direktori):ini untuk file dan direktori langsung di bawah direktori saat ini, yang namanya mengandung
.
:ini untuk semuanya:
Diambil dari sini http://www.zsh.org/mla/users/2002/msg00033.html
Dalam bash,
**
bersifat rekursif jika Anda mengaktifkanshopt -s globstar
.sumber
Kamu bisa memakai
di bash
sumber
Ini hanya terlihat di direktori saat ini . Itu mengutip "$ PWD" dalam kasus mengandung spasi.
sumber
Perintah:
ls -1 -d "$PWD/"*
Ini akan memberikan path absolut dari file seperti di bawah ini.
sumber
Ini
$PWD
adalah pilihan yang baik oleh Matius di atas. Jika Anda ingin menemukan hanya mencetak file maka Anda juga dapat menambahkan opsi -type f untuk mencari hanya file normal. Pilihan lain adalah "d" untuk direktori saja dll. Jadi dalam kasus Anda itu akan menjadi (jika saya ingin mencari hanya file dengan .c ext):atau jika Anda ingin semua file:
Catatan: Anda tidak dapat membuat alias untuk perintah di atas, karena $ PWD otomatis dilengkapi ke direktori home Anda ketika alias sedang diatur oleh bash.
sumber
Jika Anda memberi perintah find jalur absolut, itu akan memuntahkan hasilnya dengan jalur absolut. Jadi, dari direktori Ken jika Anda mengetik:
(bukannya jalur relatif
find . -name bar -print
)Anda harus mendapatkan:
Oleh karena itu, jika Anda menginginkan
ls -l
dan mengembalikannya ke jalur absolut, Anda bisa memberi tahu perintah find untuk mengeksekusils -l
pada apa pun yang ditemukannya.CATATAN: Ada ruang antara
{}
dan;
Anda akan mendapatkan sesuatu seperti ini:
Jika Anda tidak yakin di mana file itu berada, Anda selalu dapat mengubah lokasi pencarian. Selama jalur pencarian dimulai dengan "/", Anda akan mendapatkan jalur absolut sebagai balasannya. Jika Anda mencari lokasi (seperti /) di mana Anda akan mendapatkan banyak kesalahan yang ditolak izin, maka saya akan merekomendasikan redirect kesalahan standar sehingga Anda benar-benar dapat melihat hasil pencarian:
(
2>
adalah sintaks untuk shell Borne dan Bash, tetapi tidak akan bekerja dengan shell C. Mungkin juga bekerja di shell lain, tetapi saya hanya tahu pasti bahwa itu bekerja di Bourne dan Bash).sumber
ls
proses yang sama dengannya-exec ls -ld {} +
. (Anda mungkin ingin-d
tidak memilikils
daftar isi direktori). Atau lebih baik, gunakan fitur bawaanls
denganfind ... name bar -ls
. Juga, Anda memiliki sintaks yang salah untuk satu arg per perintah: Anda harus mengutip tanda koma dari shell, jadi begitu{} \;
.fd
Menggunakan
fd
(alternatif untukfind
), gunakan sintaks berikut:Di mana
.
pola pencarian danfoo
direktori root.Misalnya untuk daftar semua file dalam
etc
rekursif, jalankan:fd . /etc -a
.sumber
Hanya sebuah alternatif
untuk menunjukkan bahwa
*
ekspansi shell, jadiakan melakukan hal yang sama (kelemahan yang tidak dapat Anda gunakan
-1
untuk memisahkan dengan baris baru, bukan spasi).sumber
-1
untuk memisahkan dengan garis?sumber
Berikut adalah contoh yang mencetak daftar tanpa periode tambahan dan yang juga menunjukkan cara mencari kecocokan file. Semoga ini membantu:
sumber
Ini berhasil untuk saya. Tapi itu tidak tercantum dalam urutan abjad.
Perintah ini mencantumkan secara alfabetis dan juga daftar file yang tersembunyi.
sumber
stat
Path absolut dari satu file:
sumber
Anda mungkin ingin mencoba ini.
Anda bisa mendapatkan jalur abs menggunakan
for
loop danecho
tanpa itufind
.sumber
Jika Anda perlu daftar semua file saat ini serta sub-direktori
Jika Anda perlu daftar semua file hanya di direktori saat ini
sumber
Ini akan memberikan jalur kanonik (akan menyelesaikan symlink):
realpath FILENAME
Jika Anda ingin jalur kanonik ke symlink itu sendiri, maka:
realpath -s FILENAME
sumber
Sebagian besar jika tidak semua metode yang disarankan menghasilkan jalur yang tidak dapat digunakan secara langsung di beberapa perintah terminal lain jika jalur tersebut berisi spasi. Idealnya hasilnya akan dipotong miring. Ini berfungsi untuk saya di macOS:
sumber
find / -print
akan melakukan inisumber
sumber