Dapatkan path absolut file menggunakan perintah 'temukan'

26

Apakah ada cara untuk mendapatkan path absolut dari file yang sedang dicari?

Sebagai contoh:

find .. -name "filename"

Ini memberi saya hasil seperti ../filenametetapi saya ingin jalur lengkap.

Yang saya butuhkan adalah menemukan di direktori induk dan anak-anaknya, untuk file tertentu, yang akan saya gunakan dalam skrip lain nanti.

Terima kasih

JorgeeFG
sumber
1
Pertanyaan serupa pada SO .
Glutanimate

Jawaban:

15

Coba sesuatu seperti:

find "$(cd ..; pwd)" -name "filename"
Pengamat
sumber
Terima kasih, saya hanya menguji $(cd ..; pwd). Ini berfungsi dengan baik, tetapi jika saya melakukannya sendiri di Terminal, saya tidak bisa mendapatkan dir induk ... saya mendapatkan "Bash: <dir>: Adalah direktori. Dan jika saya lakukan $(cd ..; echo "something")saya mendapatkan" sesuatu: bukan command "
JorgeeFG
Apakah maksud Anda seperti perintah terpisah? Maka Anda harus meninggalkan tanda dolar:(cd ..; pwd)
Scrutinizer
Terima kasih, itu dia. Referensi mengapa saya harus menghapus $, bagaimana hal itu mempengaruhi subkulit?
JorgeeFG
1
Ya ( ... )berarti dijalankan dalam subkulit, output ditulis ke stdout. $( ... )singkatan dari "substitusi perintah". Yang terakhir dapat digunakan seolah-olah itu adalah ekspansi variabel.
Scrutinizer
find / -name "filename"
Panther
12

Coba gunakan -execopsi find:

find .. -name "filename" -exec readlink -f {} \;

Catatan: readlinkmencetak nilai tautan simbolik atau nama file kanonik.

Sylvain Pineau
sumber
ini akan memanggil readlink pada setiap file sehingga akan sangat tidak efektif.
bac0n
9

Anda dapat menggunakan bashTilde Expansion untuk mendapatkan jalur absolut dari direktori kerja saat ini, cara ini findmencetak jalur absolut untuk hasil juga:

find ~+ -type f -name "filename"

Jika dieksekusi di ~/Desktop, ini diperluas ke

find /home/yourusername/Desktop -type f -name "filename"

dan mencetak hasil seperti:

/home/yourusername/Desktop/filename

Jika Anda ingin menggunakan pendekatan ini dengan direktori induk direktori kerja saat ini , Anda harus melakukannya cdsebelum menelepon find:

cd .. && find ~+ -type f -name "filename"
pencuci mulut
sumber
7

Cara paling sederhana adalah

find "$(pwd -P)" -name "filename"
Vivek
sumber
Iya nih! Ataufind `pwd -P` -name "filename"
Apollys mendukung Monica
ini akan menemukan file dalam direktori saat ini bukan dari induknya.
bac0n
1

Juga menggunakan PWD dapat menunjukkan kepada Anda direktori lengkap. Pwd akan menunjukkan kepada Anda semua direktori Anda seperti memperluas nama file. Semoga ini bisa membantu.

Sir_Dippingsauce
sumber
1

Ini bekerja untuk saya, tetapi hanya akan mengembalikan kejadian pertama.

realpath $(find . -type f -name filename -print -quit)

Untuk mendapatkan path lengkap untuk semua kejadian (seperti yang disarankan oleh Sergiy Kolodyazhnyy)

find . -type f -name filename | xargs realpath
Wyrmwood
sumber
Komentar sebelumnya dihapus, +1, kerja bagus @Wyrmwood
Sergiy Kolodyazhnyy
1

Menghapus komponen direktori terakhir dengan Ekspansi parameter .

find "${PWD%/*}" -name 'filename'

Contoh bagaimana Anda dapat menggunakan mapfile untuk menyimpan output dari find ke array yang diindeks untuk digunakan nanti.

mapfile -t -d '' < <(find ${PWD%/*} -name 'filename' -print0)

(jika tidak ada nama array yang ditentukan, MAPFILE akan menjadi nama array default).

for i in "${MAPFILE[@]}"; do
    echo "$((n++)) $i"
done
bac0n
sumber