如何使用特定扩展名递归重命名文件以删除音频文件中不需要的字符

如何使用特定扩展名递归重命名文件以删除音频文件中不需要的字符

我想.m4a在子目录中递归地重命名具有扩展名的文件,以删除音频文件中不需要的字符,例如 [']。

04 Tears Don't Fall.m4a这是因为在没有其他文件的情况下,该文件发生了以下情况 :

无法加载文件 2005-09-30 - 毒药(豪华版)[US - 88697-09021-2 - 2007]/04 Tears Don't Fall.m4a。也许它不是受支持的文件格式?尝试使用 ffmpeg 加载时,出现以下错误:FFmpeg 无法读取文件。

答案1

工作中肯定还有其他问题,因为ffmpeg完全能够读取包含单引号的文件名:

mkdir '2005-09-30 - The Poison (Deluxe Edition) [US - 88697-09021-2 - 2007]'
cp -p {another.m4a} "2005-09-30 - The Poison (Deluxe Edition) [US - 88697-09021-2 - 2007]/04 Tears Don't Fall.m4a"

ffmpeg -i "2005-09-30 - The Poison (Deluxe Edition) [US - 88697-09021-2 - 2007]/04 Tears Don't Fall.m4a"

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2005-09-30 - The Poison (Deluxe Edition) [US - 88697-09021-2 - 2007]/04 Tears Don't Fall.m4a':
  Metadata:
    major_brand     : M4A
    minor_version   : 0
    compatible_brands: M4A mp42isom
...

也许你没有正确引用。不幸的是,如果没有看到您的代码,就无法验证这一点,只能将其标记为可能的问题。

但是,如果您确实想重命名文件以删除一组字符,则可以使用如下代码:

find . -type f -name '*.m4a' -exec \
    sh -c 'for f in "$@"; do echo mv "$f" "${f'"//[\']/"'}"; done' _ {} +

echo当您准备好执行时删除mv

[\']范围可以扩展以包括要删除的其他字符。例如,您可以选择[\'\\\"\\\`:]删除单引号和双引号、反引号和冒号。 (单引号必须以 前缀\;双引号、反引号和美元符号必须以 前缀\\\。)

答案2

#!/bin/bash

shopt -s globstar
for fn in **/*\'*.m4a; do echo mv "$fn" "${fn/\'/}"; done

echo在真正重命名之前需要检查结果。

答案3

首先,我们编写一个 shell 脚本,将 $1 移动到 $1(不带 (')),我们将其称为special_move.sh。不要忘记授予文件执行权限。

#!/bin/bash

orgFile=$1
destFile=${orgFile//\'/}

echo "mv $orgFile $destFile"
#mv $orgFile $destFile

然后移动到存储文件的根目录并输入 cmd

find . -name "*'*.m4a" -exec /absolute/path/special_move.sh {} \;

测试令人满意,取消注释脚本文件的最后一行。

相关内容