用于重命名目录中文件的 Bash 脚本

用于重命名目录中文件的 Bash 脚本

我正在尝试编写一个脚本,将目录作为命令行参数,并遍历目录中的文件并将其扩展名更改为.bu

我以为这会起作用,但我得到的输出'.bu' is not a target directory

#!/bin/bash

for  f in $1; do
  mv "$f".* .bu
done

答案1

#!/bin/bash
cd $1
for f in *; do 
mv  "$f" "${f%.*}.bu"
done

答案2

尝试一下这个(假设这$1是一个文件夹):

for f in $1/*; do 
  mv "$f" "$f.bu"
done

或者使用重命名实用程序:

rename -v 's/$/\.bu/' $1/*

这些命令添加了扩展。如果你想更改现有的扩展使用:

rename -v 's/\.[^\.]+$/\.bu/' $1/*

答案3

采用 KISS 方法,我推荐以下脚本

#! /bin/bash
cd $1;
rename 's/$/\.bu/' *

这会将工作目录更改为第一个参数,然后.bu为所有文件添加扩展名。这样就不再需要 for 循环了。

编辑:
如果你想更改扩展名(而不仅仅是添加它),你可以尝试

rename 's/\..*$/\.bu/' *

在上面的脚本中,改为使用命令。

答案4

$1脚本中的bash是对从命令行传递的第一个参数的引用,因此您实际上是在尝试处理单个文件夹。

关于如何使用纯解决您的问题已经有答案了bash,但我想补充一点,如果您需要更好地过滤正在处理的内容,您可以使用find一些选项来选择要处理的文件:

find <path_to_directory> -maxdepth 1 -type f

*<path_to_directory> = 目录路径

然后使用重定向循环遍历文件列表stdin

#!/bin/bash

while read file
do
    rename 's/\..*/\.bu/' $file
done <<< $(find $1 -maxdepth 1 -type f)

相关内容