macOS Bash - 使用 Bash 以递归方式在文件夹中具有特定扩展名的文件名前面添加字符

macOS Bash - Adding characters in front of file names with a specific extension in folders recursively using Bash

提问人:iPadawan 提问时间:10/11/2023 更新时间:10/12/2023 访问量:43

问:

我必须用“.abc”这样的扩展名重命名文件,并在其前面添加一个前缀。

如“OldFileName.abc”到“AAA_OldName.abc”。

macOS文件实际上是包含内容的文件夹,例如应用程序.app扩展名。这些文件夹位于顶部目录中,还有其他几个目录。

我该怎么做?我是这样想的:

find /Users/iPPi/PhotoLR -type d -iname '*.abc' |     while read d; do
  echo mv "$d" "AAA_${d%.abc}"
  mv "$d" "AAA_${d%.abc}"
done

这是错误的,因为它不起作用,而且我的 Bash 知识已经走到这一步。 提前感谢您对我的帮助。

如果我的问题不够清楚,请让我纠正。

bash macos 文件 重命名

评论

0赞 Barmar 10/11/2023
你为什么要使用?这将删除扩展名。${d%.abc}.abc
0赞 Barmar 10/11/2023
那么扩展名还是?还是两者兼而有之,比如?.abc.appsomething.abc.app
0赞 iPadawan 10/12/2023
@Barmar,这就是我寻求建议的原因。关于您的第二篇文章,.abc ..app被用来明确表示它是一个文件夹,就像一个带有内容s的应用程序一样。
0赞 Barmar 10/12/2023
所以你的意思是像这样?Foo.app/filename.abc
1赞 Paul Hodges 10/12/2023
也可以在相关的 BashFAQ 上获得战利品。

答:

2赞 Barmar 10/12/2023 #1

您需要将路径名拆分为目录和文件名,以便仅将文件名放在之前。AAA_

find /Users/iPPi/PhotoLR -type d -iname '*.abc' |     while read -r d; do
    file=${d##*/}
    dir=${d%/*}
    newfile="$dir/AAA_$file"
    echo mv "$d" "$newfile"
    mv "$d" "$newfile"
done

评论

0赞 tripleee 10/12/2023
也可以使用代替单独的;并且对于稳健性,可能比管道更有利于(尤其是没有)。另请参阅 mywiki.wooledge.org/BashFAQ/020mv -vechofind -execwhile readread -r
0赞 Barmar 10/12/2023
find -exec当您执行多个命令时,是一个真正的 PITA。你可以执行,但这会变得复杂,所以我通常建议将命令放在脚本中并执行 .但无论如何,这个答案的目的是展示如何处理文件名以执行 .bash -c ...-exec /path/to/script {} \;mv
0赞 tripleee 10/12/2023
没有异议。感谢您的更新。
0赞 tripleee 10/12/2023
不过,这样的东西在这里会很好用。-execdir mv -v {} AAA{} \;
0赞 Barmar 10/12/2023
请随时发布另一个答案。
0赞 tripleee 10/12/2023 #2

在此特定方案中,

find /Users/iPPi/PhotoLR -type d -iname '*.abc' -execdir mv {} AAA_{} \;

将避免显式拆分目录名称的麻烦,就像 Barmar 的回答一样。 在找到项目的目录中,在项目的基本名称上执行命令,因此基本上可以在这里为您完成所有(不是很)繁重的工作。-execdirfind

当涉及到带有换行符的文件名等时,这具有额外的鲁棒性;另请参阅 https://mywiki.wooledge.org/BashFAQ/020 以获取有关该主题的(更多)信息。find ... | while read -r