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:

 


#!/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