Bagaimana saya secara rekursif menelusuri direktori dan memberi nama file setelah direktori?

0

Apa yang saya coba lakukan adalah menggabungkan semua file dalam subdirektori menjadi file baru, dan memberikan file gabungan yang baru dengan nama yang sama dengan subdirektori, dan saya tidak tahu bagaimana melakukan ini di Bash. Inilah cara saya mendekatinya: Saya memiliki sejumlah direktori, masing-masing dengan nama file yang unik (dengan spasi!). Di dalam masing-masing direktori ini, ada sejumlah file yang diberi nama numerik, seperti:

Home/Unique name/1.pdf  
Home/Unique name/2.pdf  
Home/Unique name/3.pdf  
Home/Unique name/4.pdf  
....  
Home/Other Unique name/1.pdf  
Home/Other Unique name/2.pdf  
Home/Other Unique name/3.pdf  
Home/Other Unique name/4.pdf

Yang ingin saya lakukan adalah menulis skrip bash (dari Homedirektori) ke:

  1. Pergilah ke setiap direktori unik, dan lakukan perintah pada setiap file dalam direktori itu (dalam kasus saya, salin semuanya ke direktori yang berbeda).
  2. Saya kemudian telah menulis skrip berbeda script.shyang akan melakukan perintah lain (dalam hal ini, gabungkan semua PDF menjadi satu file, temp.pdf). Saya kemudian ingin mengganti nama temp.pdffile itu setelah direktori Unique name.pdf(dengan spasi).
  3. Saya harus mengikuti proses ini untuk sejumlah subdirektori.

Saya telah mencoba solusi dengan sejumlah for loop, sementara loops dan menggunakan perintah find, tapi saya tidak cukup nyaman dengan bash untuk debug dengan nyaman atau menggunakan variabel-variabel ini dengan tingkat kepercayaan apa pun. Saya juga yakin bahwa ada cara yang lebih efisien untuk melakukan apa yang saya lakukan, tetapi saya telah mem-boot script bersama-sama selama periode waktu tertentu.

Marc
sumber
Seharusnya program C atau Java yang relatif sederhana.
Daniel R Hicks
Kecuali jika Anda melakukan ini untuk file yang disandikan teks biasa, file yang dihasilkan tidak akan dianggap valid. Misalnya, jika Anda baru saja menggabungkan data biner dalam beberapa PDF, file yang dihasilkan bukan file yang sesuai dengan PDF (jika Anda beruntung, itu mungkin hanya menampilkan PDF pertama). Anda memerlukan alat khusus untuk format file yang ingin Anda gabungkan. Untuk bergabung dengan beberapa file, Anda bisa menggunakan catuntuk menampilkan semuanya dalam urutan yang tepat, dan menyalurkan hasilnya catke file baru.
Terobosan
@DanielRHicks menggunakan C untuk sesuatu yang sederhana ini akan menjadi meriah berlebihan
evilsoup

Jawaban:

1

Cara POSIX adalah menggunakan print . -type d ... | while read f; do, tetapi kecuali Anda terobsesi dengan portabilitas 100%, saya tidak akan repot dengan itu. Jika Anda memiliki bash 4+ dan pdfunite(diinstal secara default di Ubuntu 13.04 saya), Anda dapat melakukan ini dalam dua baris:

shopt -s globstar
for f in ./**/; do pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done

Catatan yang shopt -s globstarperlu berada di jalur yang terpisah dengan yang lainnya. Dengan globstar diaktifkan, **perluas semua file dan direktori di direktori saat ini, secara rekursif. Karena file tidak dapat berisi /nama mereka, **/akan diperluas hanya ke direktori. Saya menggunakan ./**/jika direktori Anda dimulai dengan tanda hubung ( -), karena hal ini dapat menyebabkan masalah, karena banyak program memperlakukan apa pun yang dimulai dengan -opsi.

Seperti yang ditulis, ini tidak akan menyalin PDF ke direktori lain, tapi itu cukup sepele untuk ditambahkan:

for f in ./**/; do cp "$f"/*.pdf /target/dir/; pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"; done

Jika Anda ingin menggunakan skrip pdf-combining kustom Anda sendiri, maka cukup ganti baris sesuai - tapi ingat bahwa esensi skrip shell adalah menyusun perintah yang sudah ada sebelumnya.

Ini versi yang agak lebih portabel:

print . -type d -print0 | while read -d $'\0' f; do
  pdfunite "$f"/*.pdf "$f"/"$(basename "$f").pdf"
done
Evilsoup
sumber
0
  1. Buat forloop dengan find /home/ -type f -name "*.pdf"sebagai variabel
  2. Salin file ke tempat yang Anda inginkan, ambil $ VARIABLE dan proseskan melalui sed / awk untuk menghapus "/".

Posting skrip Anda dan kami dapat membantu Anda untuk memperbaikinya.

Anda selalu dapat menjalankan skrip dengan bash -xuntuk men-debug mereka atau Anda dapat mengatur !#/bin/bash -xuntuk selalu mengeksekusi dalam mode debug (verbose).

Chris
sumber