一、开肠白:一埋头的书可怎么办?
话说,你有没有过这样的体验?------硬盘里塞满了电子书,PDF、EPUB、MOBI、TXT,五花八门,东一榔头西一棒槌。有的躺在D盘"学习资料"里,有的藏在E盘"新建文件夹(2)"里,还有的干脆叫"【终极珍藏版】www.java1234.com《XXX》.pdf"。
想找本书?比大海捞针还难。想整理?手动拖拽分类,没弄几本就累得眼冒金星,还动不动就弹出"路径太长"、"文件名含非法字符"的报错,气得你想砸电脑。
没错,这就是我,一个资深"藏书家"(自封的)的日常。直到有一天,我看着那台专门攒来存书、配置i3-8100、塞了10块硬盘的"老黄牛"电脑,和里面乱成一锅粥的Fedora 42系统,终于忍无可忍:必须搞一套全自动、零报错、小白也能用的图书管理方案!
于是,就有了下面这套"傻瓜式"自动化流程。别怕,咱们不用记命令,不用懂高深原理,照着做就行,包教包会!
二、第一步:先把家先搭好(目录规划)
整理东西,就像收拾房间,得先有柜子、抽屉和标签。我们的"书柜"长这样:
/home/user/Books (这就是咱们的大本营!)
├─ 00_正在阅读 (正在看的书,放这儿)
├─ 01_待读清单 (想读但还没开始的)
├─ 02_已读完归档 (看完的,挪过来归档)
├─ 04_原版扫描PDF (那些扫描版的大部头)
├─ 05_重复文件待查重 (哎呀,这本书好像有两本?先放这儿)
├─ 06_Trash_30d (新下载的书,都先扔这个"临时仓库")
└─ 03_藏书总库 (真正的图书馆!下面细说)
├─ A_哲学宗教
│ ├─ 马哲著作
│ ├─ 西方哲学
│ ├─ 中国哲学
│ ├─ 宗教佛学
│ └─ 逻辑伦理美学
├─ B_社会科学
│ ├─ 社会学
│ ├─ 人口统计
│ └─ 管理总论
... (后面还有C到Z,共十几大类,几百个小类,这里先省略,总之很全!)
设计原则就三条:
- 起名要规矩:只用字母、数字、下划线和短横线,像【】、《》这些全角符号统统踢出去,Linux系统不认识它们,会生气报错。
- 路径要短小:名字别起太长,避免触发Linux的"路径长度限制"Buff。
- 层级要清晰:一级大类(比如"计算机技术")→ 二级中类(比如"编程语言")→ 三级小类(比如"Python")。找书时一目了然。
三、第二步:让脚本干活(创建目录)
难道要我们手动去点鼠标,创建上面那好几百个文件夹?当然不!咱们写个"施工队脚本",让它一键盖好所有"房间"。
新建一个文件,叫 create_book_dir.sh,把下面的代码复制进去:
#!/bin/bash
# 电子书标准目录创建脚本 最终稳定版
BASE="/home/user/Books"
一级基础目录
mkdir -p
"$BASE/00_正在阅读"
"$BASE/01_待读清单"
"$BASE/02_已读完归档"
"$BASE/04_原版扫描PDF"
"$BASE/05_重复文件待查重"
"$BASE/06_Trash_30d"
"$BASE/03_藏书总库"
A 哲学宗教
mkdir -p
"$BASE/03_藏书总库/A_哲学宗教/马哲著作"
"$BASE/03_藏书总库/A_哲学宗教/西方哲学"
... (中间省略N行,就是按上面目录树创建所有文件夹)
Z 杂项
mkdir -p "$BASE/03_藏书总库/Z_杂项未分类"
echo "✅ 全部图书分类目录创建完成(无报错版)"
然后,在终端里给它"开工许可证",并运行:
chmod +x /home/user/create_book_dir.sh
/home/user/create_book_dir.sh
唰唰几下,所有文件夹就都建好了,一个报错都不会有!
四、第三步:让脚本再干更多活(智能分类)
家搭好了,书怎么自动归位?靠另一个更牛的"图书管理员脚本"------book_full_sort.sh。
它的超能力:
- 自动洗澡 :把文件名里恶心的
[www.java1234.com]广告、多余的空格统统洗掉。 - 自动认亲:看文件名里的关键词。比如文件名带"Python",就扔进"编程语言";带"科幻",就扔进"科幻奇幻"。
- 绝不误伤:发现两本一模一样的书?不会覆盖!会把后到的挪到"05_重复文件待查重"文件夹,等你发落。
- 写日记:干了啥,移动了哪本书,全都记在日志里,随时可查。
- 老毛病全治好:之前手动整理时遇到的什么"路径不存在"、"正则报错"、"引号不闭合"等乱七八糟的错误,在这个脚本里都被根治了。
脚本太长,这里放个核心片段看看它怎么"认亲"的:
#!/bin/bash
set -euo pipefail
# ... (省略路径和日志设置)
find "$INBOX" -maxdepth 1 -type f -iname ".epub" -o -iname ".pdf" ... | while read -r f; do
# 1. 先给文件名"洗澡"
clean="${name/[www.java1234.com]/}"
clean=$(echo "$clean" | sed -E 's/^[ ]+//;s/[ ]+$//')
low=$(echo "$clean" | tr 'A-Z' 'a-z') # 转成小写,方便匹配
# 2. 开始"认亲"!
dst="" # 准备一个目的地变量
if [[ $low =~ python|编程|爬虫 ]]; then
dst="$LIB/J_计算机技术/编程语言"
elif [[ $low =~ java|c\+\+|golang|c\# ]]; then
dst="$LIB/J_计算机技术/编程语言"
elif [[ $low =~ 科幻|奇幻|星际 ]]; then
dst="$LIB/G_文学小说/类型小说/科幻奇幻"
elif [[ $low =~ 股票|基金|理财|金融 ]]; then
dst="$LIB/D_经济管理/金融投资"
# ... (此处省略上百个elif,覆盖所有分类)
else
dst="$LIB/Z_杂项未分类" # 实在认不出的,去"杂项"呆着
fi
3. 检查是否"撞衫"(重复文件)
if [ -f "$target_full" ]; then
mv -v "$f" "$DUP/$fn"
continue
fi
4. 搬家!
mv -v "$f" "$target_full"
done
运行它同样简单:
chmod +x /home/user/book_full_sort.sh
/home/user/book_full_sort.sh
从此,你只需要把新下载的书往 06_Trash_30d 文件夹里一扔,运行这个脚本,泡杯茶的功夫,书就整整齐齐各回各家了!
五、遇到问题怎么办?(报错总结)
以前手动整理是不是老踩坑?咱们这次一次性把坑都填平!
坑一:路径不存在或名字太奇葩
症状 :脚本说"No such file or directory",或者抱怨"Invalid argument"。
病根 :文件夹名里有【】、《》这些中文符号,或者名字长得离谱。
药方:咱们的目录命名规则(只用英文、数字、下划线)就是专治这个的,从根上杜绝。
坑二:Bash 正则语法报错
症状 :脚本运行到一半崩了,提示语法错误,尤其是带 # 号的地方。
病根 :Bash 把 c# 里的 # 当成注释了!
药方 :新脚本里已经把类似 c# 这样的关键词用更稳妥的方式判断,并且把超长的正则判断拆成了短小精悍的句子,再也不怕"#"来捣乱。
坑三:引号不对称或脚本报 EOF 错
症状 :"unexpected EOF while looking for matching ..." 或者 "syntax error near unexpected token"。
病根 :复制代码时漏了引号,或者一行命令长得像裹脚布。
药方:新脚本严格检查了所有引号成双成对,并且把代码分行写得清清楚楚,一目了然。
坑四:文件名有广告或空格,分类失败
症状 :一本叫"【赠品】www.java1234.com Python学习手册 .pdf"的书,脚本不认识它。
病根 :广告前缀和多余空格干扰了关键词匹配。
药方 :脚本第一步就是"洗澡",强力去除 [www.java1234.com] 和首尾所有空格,让书名"素颜"出镜。
坑五:文件被覆盖,消失了!
症状 :整理完发现,怎么少了几本书?
病根 :同名文件被后来的覆盖了。
药方 :脚本有"查重科"!发现重名文件,不是覆盖,而是把它请到 05_重复文件待查重 单间,等你亲自审核。原书安然无恙。
六、怎么用?四步实战流程
理论说完,实战开始!就四步,跟泡面一样简单:
- 搭房子(仅第一次) :运行
create_book_dir.sh,把几百个文件夹一键建好。 - 扔书 :以后所有新下载的电子书,统统丢进
/home/user/Books/06_Trash_30d这个"临时仓库"。 - 喊管家 :运行
book_full_sort.sh。你的"AI图书管家"就会自动给书洗澡、认亲、搬家、记日记。 - 偶尔大扫除 :定期去看看
05_重复文件待查重里有没有误伤,把看完的书从"正在阅读"挪到"已读完归档"。
七、总结:你得到了什么?
- 一套在 Linux 上稳如老狗、绝不报错的标准化图书仓库。
- 一个令行禁止、说建就建的"文件夹施工队"。
- 一个眼疾手快、聪明绝顶的"AI图书管家",7x24小时自动帮你整理分类。