linux - bash 脚本;重命名/子目录中的文件
问题描述
我在我的老式 BBS 上托管了巨大的文件档案。[Mystic] 软件不像具有长文件名或扩展字符的 Linux 那样宽容或强大。
文件名的长度应少于 80 个字符。
文件名应该只有字符 AZ 和 1-9。没有“!@ # $ % ^ &”等 - 也没有带有波浪号或插入符号的字母。
这是一个集合目录的示例:
pi@bbs:/mnt/Beers4TB/opendirs/TDC19 $ ls -all
total 28
drwxrwxr-x 6 pi pi 4096 Sep 16 08:08 .
drwxrwxr-x 11 pi pi 4096 Oct 6 15:04 ..
drwxrwxr-x 2 pi pi 4096 Sep 13 20:13 ANSi
drwxrwxr-x 2 pi pi 4096 Oct 6 21:16 Drivers
drwxrwxr-x 10 pi pi 4096 Sep 16 08:12 Games
-rw-rw-r-- 1 pi pi 1056 Sep 13 20:12 INTRO.TXT
drwxrwxr-x 2 pi pi 4096 Sep 16 08:08 ListsNotes
在 /subdirectories 中,它们可能会更深 2、3 或更深。
以下是一些文件当前命名的示例:
pi@bbs:/mnt/Beers4TB/opendirs/TDC19/Games/Applications $ ls M*
'Mean 18 - Golf Menu [SW] (1988)(Robert J. Butler) [Sports, Golf, Utility].zip'
'Mean 18 - M18 (1988)(Ken Hopkins) [Sports, Golf, Utility].zip'
'Metaltech- Battledrome Game Editor (1994)(Sierra On-Line, Inc.) [Utility].zip'
'Might and Magic III Character Editor (1991)(Blackbeard'\''s Ghost) [Utility].zip'
'Might Magic 3 Character viewer-editor v1.1 (1991)(Mark Betz and Chris Lampton) [Editor].zip'
我做过一些有希望的事情……这个 echo/sed 命令删除了一些高字符:
echo "Might and Magic III Character Editor (1991)(Blackbeard'''s Ghost) [Utility].zip" | sed -r -e 's/\x27+//g' -e 's/[][")(]//g' -e 's/[ ]+//g'
(它重命名文件:) Might_and_Magic_III_Character_Editor_1991_Blackbeards_Ghost_Utility.zip
然后,我有一个命令将重命名整个 / 子目录,但它不会删除任何字符:
for f in *.zip; do mv "${f}" "${f//[][\")( ]/_}"; done
这很好......但我必须摆脱高字符......而且,这种方法有时会在文件名中添加多个空格 - 这增加了最大 80 个文件名限制 - 并且没有内置安全保护......
我致力于添加对通过多个 / 子目录的支持,但我知道我的语法仍然是错误的......但是,你可以看看我试图做什么:
P=$(pwd); for D in $(find . -maxdepth 1 -type d); do cd $D; for f in *.zip; do mv "${f}" "${f//[][\")( ]/_}"; cd $P; done
所以,最后 - 我对任何 Linux 命令持开放态度:删除任何不是 AZ 或 1-9 的字符。删除文件名中的任何多余空格。确保文件名最多只有 80 个字符,只需删除 .zip(或 .anything)扩展名之前的最后一位。从主 / 目录开始并重命名主目录中每个 / 子目录中的所有文件。
最后; 我总是首先尝试将事情放在一起......我从同事那里得到帮助 - 我最后来到互联网......但我想了解如何自己编写这种确切的东西。如果您对在哪里学习有任何建议,那也将受到好评。这次我试图正确地发布这个问题,如果我没有把每条规则都正确,请原谅。
保利42o。. . . . /s
解决方案
该命令tr -cd
删除所有不在给定列表中的字符。
for f in *.zip; do
mv "$f" "$(tr -cd 'A-Za-z0-9. \n' <<< "$f")"
done
您可以使用sed
在相邻括号之间添加空格:
for f in *.zip; do
mv "$f" "$(sed 's/)(/ /g' <<< "$f" | tr -cd 'A-Za-z0-9. \n'))"
done
并且可以sed
用来合并多个空间。
for f in *.zip; do
mv "$f" "$(sed 's/)(/ /g' <<< "$f" | tr -cd 'A-Za-z0-9. \n' | sed 's/ \+/ /g'))"
done
推荐阅读
- reactjs - 更新的反应上下文值未反映在上一个屏幕中
- actionscript-3 - 终止对 Play 游戏服务中的多人 API 的支持
- android - 我需要现有 Firebase 项目中的 GoogleService_Info.plist 文件
- python - 仅在某些 PDF 上使用 PyPDF2 发出水平翻转 PDF
- sql - 使用 Adobe Analytics 数据计算 BQ 中的访问
- c# - 扩展通用分部类
- discord - TypeError:无法读取 null 的属性“禁令”| 不和谐.js
- python - 在 pytorch 中识别图像的问题
- swift - Swift Combine 不接收已发布的值
- jquery - 具有多个数据源的 jsGrid