“Find” output relatif terhadap direktori

34

Saya ingin menggunakan finddaftar semua file dan direktori secara rekursif dalam root yang diberikan untuk cpiooperasi. Namun, saya tidak ingin direktori root itu sendiri muncul di jalur. Misalnya, saya saat ini mendapatkan:

$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2

Tapi, saya ingin mendapatkannya

file1
dir1
dir1/file2

(perhatikan root juga tidak dalam output yang saya inginkan, tapi itu mudah untuk dihilangkan dengan tail).

Saya menggunakan OS X, dan saya lebih suka tidak menginstal alat tambahan (mis. Temukan GNU) jika memungkinkan, karena saya ingin berbagi skrip yang saya tulis dengan pengguna OS X lainnya.

Saya sadar ini bisa dilakukan dengan cutmemotong daftar root, tapi itu sepertinya solusi yang kurang optimal. Apakah ada solusi yang lebih baik?

nneonneo
sumber
find diskimg/* | cut -d '/' -f2-
nik.shornikov

Jawaban:

18

Jika apa yang Anda coba lakukan tidak terlalu rumit, Anda dapat melakukannya dengan:

find diskimg | sed -n 's|^diskimg/||p'

Atau cut:

find diskimg | cut -sd / -f 2-
BriGuy
sumber
Anda dapat memilih (hampir) pemisah untuk perintah, jadi: find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'(perhatikan saya menambahkan juga '-e', dan ^praktik yang baik (tidak perlu di sini, karena Anda yakin setiap baris akan memiliki ini ... tetapi masih praktik yang baik) , dan menyimpan beberapa cpu;))
Olivier Dulac
cara lain tanpa grep: find diskimg | sed -e 's|^diskimg/*||' ('/ *' akan cocok dengan sejumlah '/', bahkan 0)
Olivier Dulac
Ini cutperintah lebih bersih daripada yang saya digunakan; Saya suka itu. ( sedSolusinya juga bagus, tapi pengulangannya diskimg/sedikit disayangkan).
nneonneo
29

cd ke dalam direktori terlebih dahulu:

cd diskimg && find . 

Setelah selesai, Anda akan kembali ke direktori root Anda.

File Anda akan diawali dengan ./ dalam hal ini; satu-satunya cara saya melihat sekeliling yang akan menggunakan cut:

{ cd diskimg && find .; } | tail -n +2 | cut -c 3-

Gunakan subkulit untuk menghindari mengubah direktori shell Anda saat ini (ini tidak perlu jika Anda memipipkan output karena sisi kiri pipa sudah berjalan dalam subkulit).

(cd diskimg && find .)
Stephan
sumber
5
untuk kembali dir asli pada penyelesaian: menambahkan kurung: (cd diskimg && find . ; ). Dengan cara cd diskimg && find .itu dilakukan dalam subshell: ketika subshell itu keluar Anda kembali ke shell Anda sendiri, di direktori apa pun Anda berada.
Olivier Dulac
1
find *adalah cara lain di sekitar awalan yang tidak berguna
nik.shornikov
23

Lain, lebih kompleks tetapi hanya menggunakan pendekatan find dari jawaban saya yang lain:

find diskimg -mindepth 1 -printf '%P\n'
Stephan
sumber
Tidak semua versi finddukungan printf.
jordanm
1
Pasti; OSX saya tidak, sepertinya. Sebagian mengapa saya menawarkan solusi lain.
Stephan
2
@Stephan - lain kali Anda bisa menggabungkan jenis-jenis jawaban ini menjadi satu. Tidak perlu membuat beberapa jawaban untuk varian seperti ini.
slm
2
Hanya finddukungan GNU -printf, sementara banyak BSD findtelah menyalin beberapa fitur GNU find, belum ada yang menyalin -printf(AFAIK).
Stéphane Chazelas
yang %Puntuk path relatif adalah apa yang saya butuhkan.
Fl0v0
4

Gunakan realpathutilitas:

find diskimg -exec realpath --relative-to diskimg {} \;
dwjbosman
sumber
Rapi - terima kasih telah menunjukkan kepada saya --relative-to.
nneonneo