Конвертировать fb2 в txt

Все еще есть много устройств, которые не могут читать fb2 и могут читать txt. Кроме того, TXT-версия может занимать гораздо меньше места по сравнению с несжатой FB2.

2 ответа

Решение

В то время как калибр может сделать это, требуется>100M для установки и unoconv большинство компонентов установлено, если у вас есть LibreOffice/OpenOffice.

sudo apt-get install unoconv --no-install-recommends
unoconv -f txt *.fb2

Иногда нужно просто конвертировать fb2 в txt . Вот 3 моих сценария bash, которые я использую, чтобы сделать это рекурсивно для всех каталогов внутри текущего. Будьте осторожны, эти скрипты удалят исходные файлы fb2, поэтому запускайте их на копии ваших данных.

  1. Установить зависимости:
      sudo apt-get install uchardet dos2unix unoconv
  1. Используйте эту команду для рекурсивного преобразования любых указанных типов документов в txt:
      ./finder.sh ./convert_any_to_txt.sh fb2 fb2.zip doc docx odt

finder.sh:

      # Find files and process them using an external command.
# Usage:
#   ./finder.sh ./processing_script.sh txt fb2 fb2.zip doc docx
counter=0
find_results=()
for ext in "${@:2}"
do
    # @see https://stackoverflow.com/a/54561526/10452175
    readarray -d '' ext_results < <(find . -type f -name "*.${ext}" -print0)

    for file in "${ext_results[@]}"
    do
        counter=$((counter+1))
        find_results+=("${file}")
        echo ${counter}") ${file}"
    done
done
countOfResults=$((counter))
echo -e "Found ${countOfResults} files.\n"


echo "Processing..."
counter=0
for file in "${find_results[@]}"
do
    counter=$((counter+1))
    echo -n ${counter}"/${countOfResults}) "
    eval "$1 '${file}'"
done
echo "All files have been processed."

convert_any_to_txt.sh:

      # This script converts a single fb2 to UTF-8/LF txt.
#
# Usage to convert all fb2 to txt recursively:
#   ./finder.sh ./convert_any_to_txt.sh fb2 fb2.zip doc docx odt
#
# You should install some dependencies before:
# sudo apt-get install uchardet dos2unix unoconv

FILE_ORIGINAL=$(readlink -f "$1")
FILE_ORIGINAL_EXT="${FILE_ORIGINAL##*.}"
FILE_ORIGINAL_WITHOUT_EXT="${FILE_ORIGINAL%.*}"
FORMAT_NEW="txt"
FILE_NEW="${FILE_ORIGINAL_WITHOUT_EXT}.${FORMAT_NEW}"
echo "${FILE_ORIGINAL_EXT}: ${FILE_ORIGINAL}"

# Add "--no-launch" argument to increase the speed, but risk to fail on some file:
# unoconv --no-launch -f "${FORMAT_NEW}" "${FILE_ORIGINAL}" || exit 1
unoconv -f "${FORMAT_NEW}" "${FILE_ORIGINAL}" || exit 1

# Process given txt:
./convert_txt_to_utf8_lf.sh "${FILE_NEW}"

rm "${FILE_ORIGINAL}"

convert_txt_to_utf8_lf.sh:

      # This script converts a single file to UTF-8 and sets LF line endings.
#
# Use following command to find and convert all txt files recursively:
#   ./finder.sh ./convert_txt_to_utf8_lf.sh txt
#
# You should install some dependencies before:
# sudo apt-get install uchardet dos2unix unoconv

FILE_ORIGINAL="$1"
FILE_TEMP="${FILE_ORIGINAL}.temp"
FILE_NEW="${FILE_ORIGINAL}"
ORIGINAL_ENCODING=`uchardet "${FILE_ORIGINAL}"`
NEW_ENCODING="utf-8"

echo "${ORIGINAL_ENCODING}: ${FILE_ORIGINAL}"
iconv -f $ORIGINAL_ENCODING -t $NEW_ENCODING "${FILE_ORIGINAL}" -o "${FILE_TEMP}" # reencode to utf-8
dos2unix --quiet "${FILE_TEMP}" # transform line endings to LF
sed -i -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' "${FILE_TEMP}" # trim file (remove blank lines from begin and end)
sed -i '1s/^/\n/' "${FILE_TEMP}" # add one new line at the begining for compatibility with some devices
mv "${FILE_TEMP}" "${FILE_NEW}"
Другие вопросы по тегам