提问人:iPadawan 提问时间:10/11/2023 更新时间:10/12/2023 访问量:43
macOS Bash - 使用 Bash 以递归方式在文件夹中具有特定扩展名的文件名前面添加字符
macOS Bash - Adding characters in front of file names with a specific extension in folders recursively using Bash
问:
我必须用“.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 知识已经走到这一步。 提前感谢您对我的帮助。
如果我的问题不够清楚,请让我纠正。
答:
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 -v
echo
find -exec
while read
read -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 的回答一样。 在找到项目的目录中,在项目的基本名称上执行命令,因此基本上可以在这里为您完成所有(不是很)繁重的工作。-execdir
find
当涉及到带有换行符的文件名等时,这具有额外的鲁棒性;另请参阅 https://mywiki.wooledge.org/BashFAQ/020 以获取有关该主题的(更多)信息。find ... | while read -r
评论
${d%.abc}
.abc
.abc
.app
something.abc.app
Foo.app/filename.abc