将 fb2 转换为 txt

将 fb2 转换为 txt

仍有许多设备无法读取 fb2 但可以读取 txt。此外,与未压缩的 fb2 相比,txt 版本占用的空间要少得多。

答案1

虽然 calibre 可以做到这一点,但安装它需要 >100M,并且unoconv如果您有 LibreOffice/OpenOffice,则会安装大多数组件。

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

答案2

有时你只需要将 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}"

相关内容