今天我提交了一个 shell 命令对一些我根本不理解的音频文件产生意外结果的案例。
以下是事实:
我的操作系统是 ArchLinux,Windows 管理器是 Awesome,使用的终端是 Konsole。
有许多包含空格和/或特定字符的目录和文件,因为
',{,[,?,!
我想通过删除任何空格和/或特定字符来重命名它们。在寻找 shell 命令时,我发现这个命令可以用 a 替换(例如)该
_
字符.
:
$ find ./ -type f -exec sed -i -e 's/_/./g' {} \;
- 我在许多目录上使用了这个命令,其中所有文件都已按预期重命名,我对此感到满意。
但
- 有一些目录包含一些我想要重命名的音频文件,我在这些目录上应用了这个 bash 命令。与以前的使用相反,该过程花费了更长的时间,并且最终的结果并不符合我的预期。首先,大多数文件尚未重命名。其次,所有音频文件(mp3、flac...)都已被更改/损坏,并且不再被任何音频文件读取器识别。相比之下,我没有使用 bash 命令的音频文件总是正确的并且可以读取。
例如,当我尝试使用 smplayer 读取已更改的文件之一时,错误消息为:MPlayer/mpv 已意外完成。退出代码:2。日志文件添加:“无法识别文件格式。”
参考第一个答案,我在下面提供有关更改效果的附加信息。
使用了 3 个命令来得到我想要的:
查找 ./ -type f -exec sed -i -e 's/_/./g' {} \;
查找 ./ -type f -exec sed -i -e 's/ /./g' {} \;
查找 ./ -type f -exec sed -i -e 's/.././g' {} \;
以下是损坏之前>之后的一些文件名示例:
1_-_Bob_The_Sponge_-_Living under the Sea.flac > 1.-.Bob.The.Sponge.-. Living.under the Sea.flac(注意一些空格仍然存在)
2_-_Bob_The_Sponge_-_Nemo_my_friend.mp3 > 2.-.Bob_The.Sponge.-.Nemo my.friend.mp3(注意 1 个“_”尚未删除,名称中添加了 1 个空格)。
这里不能重现所有的情况,有些文件名已经改好了,有些是部分的,有些还是和以前一样。
更改后的文件的权重没有改变,这些文件的权限也没有改变。仅最后一次修改的日期发生了变化。
当然,我很想了解到底发生了什么。我尝试使用不同的浏览器查找解释,但没有发现任何类似或相近的问题。
所以,我的问题是:
- 为什么这个 bash 命令似乎改变了这些音频文件?
- 为什么该命令对这种类型的文件有效,而对其他类型的文件无效?
- 有什么解决方案可以扭转该命令对这些文件造成的损害?
答案1
您使用了以下命令
find ./ -type f -exec sed -i -e 's/_/./g' {} \;
这基本上是做什么的
sed -i -e 's/_/./g' filename
对于该find
命令找到的每个文件。sed
逐行浏览您的文件,然后使用s
(替代)命令,将每个_
文件替换为.
.由于您正在使用该-i
标志,因此这种情况会内联发生。难怪你的文件被损坏了!
您将无法复制旧文件。你变了_
,而且
..
到了.
。您所知道的是,.
文件中的每个字符都可能是这些字符之一(或.
)。