Конвертировать 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, поэтому запускайте их на копии ваших данных.
- Установить зависимости:
sudo apt-get install uchardet dos2unix unoconv
- Используйте эту команду для рекурсивного преобразования любых указанных типов документов в 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}"