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 Home
direktori) ke:
- Pergilah ke setiap direktori unik, dan lakukan perintah pada setiap file dalam direktori itu (dalam kasus saya, salin semuanya ke direktori yang berbeda).
- Saya kemudian telah menulis skrip berbeda
script.sh
yang akan melakukan perintah lain (dalam hal ini, gabungkan semua PDF menjadi satu file,temp.pdf
). Saya kemudian ingin mengganti namatemp.pdf
file itu setelah direktoriUnique name.pdf
(dengan spasi). - 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.
cat
untuk menampilkan semuanya dalam urutan yang tepat, dan menyalurkan hasilnyacat
ke file baru.Jawaban:
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+ danpdfunite
(diinstal secara default di Ubuntu 13.04 saya), Anda dapat melakukan ini dalam dua baris:Catatan yang
shopt -s globstar
perlu 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:
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:
sumber
for
loop denganfind /home/ -type f -name "*.pdf"
sebagai variabelPosting skrip Anda dan kami dapat membantu Anda untuk memperbaikinya.
Anda selalu dapat menjalankan skrip dengan
bash -x
untuk men-debug mereka atau Anda dapat mengatur!#/bin/bash -x
untuk selalu mengeksekusi dalam mode debug (verbose).sumber