小编vak*_*ufo的帖子

用所有类型的字符重命名大量文件,具有 POSIX 可移植性

有时我需要重命名一个目录中的所有文件(重命名约定在后面),其中文件名总是以“filenamename.extension”的形式(扩展名总是存在和变化)。该名称可能包含来自 [:graph:] 类的空格和字符。我的第一个问题是它应该在 *NIX 系统(尤其是 Linux、BSD、后来的其他系统,比如 AIX)之间绝对可移植。我的第二个问题是 [:graph:] 类。文件名可以是:

cat.txt
dog_and_cat.txt
Where is the cat?.png
my.cat.is.cute.txt.js.html
;;; ;;; ;;;.......321
áéú? _[a lot of whitespaces]_ óü^^^^^ö.jpg
Run Code Online (Sandbox Code Playgroud)

很容易看到,那些很难处理并放入 for 循环中。例如,

for i in *; do something; done
Run Code Online (Sandbox Code Playgroud)

并不总是喜欢空格和奇怪的字符,尤其是在不同的操作系统中。

重命名约定是将所有文件重命名为$FOOBAR.$EXTENSIONwhere$FOOBAR是某种散列形式,例如 md5sum。所以在 for 循环中我有一条线,就像

mv $FILE $(md5sum $FILE | sed 's/\ \ .\+//');
Run Code Online (Sandbox Code Playgroud)

它会将文件移动到自身的 md5sum,但扩展名消失了。我想保留扩展名,这些扩展名几乎总是在.[a-zA-Z0-9]{1,3}表单中。有时.tar.gz也需要保留类似的扩展(当然我可以将它们添加到变量中,例如MYEXTENSIONS='tar.gz tar.bz2 foo.bar')。

我的直觉告诉我,这个问题可以通过参数化的默认 UNIX/shell 命令解决,但现在对我来说非常困难。我相信我会从答案中学到很多东西。我知道我说的是神奇的词portability,但是如果我必须指定语言,则首选 bash 中的解决方案。

shell bash filenames rename

2
推荐指数
2
解决办法
1521
查看次数

标签 统计

bash ×1

filenames ×1

rename ×1

shell ×1