Iš Word DOCX į Obsidian: Automatinis DOCX Failų Konvertavimas į Markdown

Kaip dažnai būna, su laiku kompiuteryje prisikaupia nemažai įvairių dokumentų – tiek darbinių, tiek naminių. Kadangi dažnai naudojuosi Markdown formatą palaikančiomis aplikacijomis, tokiomis kaip Obsidian, pastebėjau, kad būtų labai patogu visus šiuos DOCX failus konvertuoti į Markdown formatą. Taip ne tik lengviau tvarkyti dokumentus, bet ir galima išnaudoti visus Obsidian teikiamus privalumus. Pasižiūrėjęs, ką Linux gali pasiūlyti šioje srityje, atradau „Pandoc“.

Kodėl „Pandoc“?

„Pandoc“ yra galingas įrankis, galintis konvertuoti failus tarp įvairių formatų. Tačiau paprasta komanda pandoc input.docx -o output.md manęs nesužavėjo. Norėjau sukurti automatizuotą sprendimą, kuris būtų pritaikytas mano poreikiams – tai yra, ne tik konvertuoti failus, bet ir pritaikyti juos Obsidian naudojimui. Taigi, nusprendžiau sukurti Bash scenarijų, kuris atliktų visą šį darbą automatiškai.

Ką gali šis scenarijus?

Šis scenarijus gali:

  1. Pakeisti failų pavadinimus, kad juose nebūtų neleistinų simbolių.
  2. Konvertuoti visus DOCX failus į Markdown formatą.
    • Pridėti specialias „properties“ (tagus) prie konvertuotų failų, kad jie būtų paruošti naudojimui Obsidian.

      Atnaujinta:
      Po konvertavimo, originalūs DOCX failai suzipuojami ir ZIP failas perkeliamas į archyvavimo katalogą $HOME/Archyvuoti/. Jei ZIP failo pavadinimas jau egzistuoja, sukuriamas naujas pavadinimas su numeriu, kad išvengtų perrašymo. Galiausiai, sėkmingai atlikus visas operacijas, originalūs DOCX failai pašalinami iš pradinio katalogo.

Scenarijaus veikimo principas

Failų pavadinimų keitimas

Pirmiausia scenarijus keičia visų DOCX failų pavadinimus, pašalindamas neleistinus simbolius. Tai atliekama naudojant sed komandą, kuri pakeičia neleistinus simbolius į pabraukimo simbolius (_).

DOCX konvertavimas į Markdown

Kiekvienas DOCX failas yra konvertuojamas į Markdown formatą naudojant „Pandoc“. Ši dalis yra gana tiesmuka, tačiau aš taip pat norėjau pridėti tam tikrus „properties“, kad būtų lengviau naudoti šiuos failus Obsidian. Todėl po kiekvieno konvertavimo prie failo pridedu YAML antraštę su žymėmis (tags).

Scenarijaus kodo pavyzdys

Štai galutinis scenarijus, kurį naudoju:

 

bash
#!/bin/bash # Nustatykite docx failų katalogą docx_dir="$HOME/Dokumentai/" # Nustatykite markdown failų katalogą md_dir="$HOME/Obsidian/notes/" # Nustatykite archyvavimo katalogą archive_dir="$HOME/Archyvuoti/" # Sukurkite archyvavimo katalogą, jei jis neegzistuoja mkdir -p "$archive_dir" # Funkcija, keičianti failų pavadinimus function replace_filenames { local files=("$1"/*.docx) for file in "${files[@]}"; do local filename=$(basename "$file") local new_filename=$(echo "$filename" | sed 's/[^a-zA-Z0-9_.-]/_/g') if [ "$filename" != "$new_filename" ]; then mv "$file" "$1/$new_filename" fi done } # Funkcija, konvertuojanti docx į markdown ir pridedanti norimą turinį function convert_to_md { local file="$1" local base_filename=$(basename "$file" .docx | tr ' ' '_') local output_file="$md_dir/$base_filename.md" pandoc -f docx -t markdown "$file" -o "$output_file" if [ $? -eq 0 ]; then echo -e "---\ntags:\n - docx\n - dokumentai\n---\n$(cat "$output_file")" > "$output_file" echo "$file sėkmingai konvertuotas į $output_file." else echo "Klaida: Konvertuojant failą '$file' įvyko klaida." fi } # Funkcija, sukurti unikalų zip failo pavadinimą function generate_unique_zip_filename { local base_filename="$archive_dir/konvertuoti_$(date +%Y%m%d)" local zip_filename="$base_filename.zip" local counter=1 while [ -f "$zip_filename" ]; do zip_filename="${base_filename}_${counter}.zip" counter=$((counter + 1)) done echo "$zip_filename" } # Pakeisti failų pavadinimus, jei reikia replace_filenames "$docx_dir" # Gaukite docx failų sąrašą docx_files=$(find "$docx_dir" -type f -name "*.docx") # Patikrinkite, ar docx failai rasti if [ -z "$docx_files" ]; then echo "Klaida: Kataloge '$docx_dir' docx failų nerasta." exit 1 fi # Atspausdinkite docx failų sąrašą count=1 echo "Pasiekiami docx failai:" for file in $docx_files; do base_filename=$(basename "$file" .docx | tr ' ' '_') echo "$count. $base_filename.docx" count=$((count+1)) done # Paprašykite vartotojo pasirinkti failą arba visų failų konvertavimą while true; do echo "Pasirinkite, kaip norite konvertuoti failus:" echo "1. Konvertuoti vieną failą" echo "2. Konvertuoti visus failus į atskirus markdown failus" read -p "Įveskite pasirinkimą (1 arba 2): " choice if [ "$choice" == "1" ] || [ "$choice" == "2" ]; then break else echo "Klaida: Netinkamas pasirinkimas. Bandykite dar kartą." fi done converted_files=() # Konvertuokite failus pagal vartotojo pasirinkimą if [ "$choice" == "1" ]; then while true; do echo -n "Įveskite konvertuoti norimo docx failo numerį: " read file_number if [[ "$file_number" =~ ^[0-9]+$ ]] && [ "$file_number" -ge 1 ] && [ "$file_number" -lt "$count" ]; then selected_file=$(echo "$docx_files" | sed -n "${file_number}p") convert_to_md "$selected_file" converted_files+=("$selected_file") break else echo "Klaida: Netinkamas įvestis. Bandykite dar kartą." fi done else for file in $docx_files; do convert_to_md "$file" converted_files+=("$file") done fi # Užzipuoti visus originalius DOCX failus, iš kurių buvo atliktas konvertavimas zip_filename=$(generate_unique_zip_filename) zip -j "$zip_filename" "${converted_files[@]}" # Perkelti suzipuotą failą į archyvavimo katalogą mv "$zip_filename" "$archive_dir" # Pašalinti originalius docx failus po sėkmingo konvertavimo ir archyvavimo for file in "${converted_files[@]}"; do rm "$file" done echo "Konvertavimas baigtas. Visi konvertuoti failai suzipuoti į $zip_filename ir perkelti į $archive_dir. Originalūs docx failai pašalinti."

Išvados

Šis scenarijus ne tik automatizuoja DOCX failų konvertavimą į Markdown, bet ir užtikrina, kad visi dokumentai būtų tinkamai archyvuoti ir saugomi. Dabar mano dokumentai yra patogiai prieinami Obsidian programoje, o pradiniai DOCX failai yra saugiai archyvuoti ir pašalinti iš pradinio katalogo.

Jei ir jūs turite daug DOCX failų ir norite juos patogiai konvertuoti bei archyvuoti, šis scenarijus gali būti puikus sprendimas jūsų poreikiams.


 

Komentarai

Populiarūs šio tinklaraščio įrašai

Configuring a NixOS firewall for everyday use

Setting up syncthing as a service on openSUSE and other Linux distributions

Monitoring SFTP server updates with Python