首页 > 解决方案 > 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

标签: linuxbashfilerenamescript

解决方案


该命令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

推荐阅读