使用 find 和 mv:

使用 find 和 mv:

我一直想给某个目录中的_new所有文件添加后缀。例如,我希望文件名为。.cexample.cexample_new.c

我尝试使用 for 循环:

for i in *.c; do mv "$i" "$i"_new; done

但这使得example.c变得example.c_new,我不知道如何使它正确。我正在考虑使用sed,但我不确定它是否有帮助。

答案1

对 Rinzwind 的答案进行一点小调整:为了匹配请求的模式,命令mv应该是:

mv "$file" "${file%.c}_new.c"

请注意,如果名称已经存在,他们使用的格式将会默默覆盖文件;使用该-i标志以便在交互使用期间提示发生冲突。

还要注意,一般来说我建议先进行试运行,方法是在命令echo前添加mv

echo mv "$file" "${file%.c}_new.c"

也可以使用“mmv”重命名文件(先进行试运行):

mmv -n '*.c' '#1_new.c'
mmv -v '*.c' '#1_new.c'

默认情况下,mmv 会在覆盖文件之前询问用户。

答案2

随着改名命令 (sudo apt install rename

rename -n 's/\.c/_new.c/ if -f' -- *.c
  • 当对输出满意时,更改-n(空运行模式)以-v显示输出的详细版本。
  • if -f应该排除目录并仅重命名文件。

在 bash 中你还可以执行以下操作:

for file in *.c
do
     [ ! -d "${file%.c}_new.c" ] && [ -f "$file" ] && echo mv -nv -- "$file" "${file%.c}_new.c"
done
  • 当对输出满意时,删除echo(空运行模式)以进行实际重命名。
  • [ ! -d "${file%.c}_new.c" ]如果新名称恰好作为目录存在,则应阻止移动到目录中。
  • [ -f "$file" ]应该排除目录,因此只重命名文件。

答案3

使用 find 和 mv:

find . -type f -name "*.c" -exec sh -c 'mv "$1" "${1%.c}_new.c"' sh {} \;

此命令使用 find 查找所有 .c 文件,然后执行 sh 命令通过删除 .c 扩展名并添加 _new.c 来重命名每个文件。

使用 for 循环:

for file in *.c; do
    mv "$file" "${file%.c}_new.c"
done

这个 for 循环遍历目录中的所有 .c 文件,并针对每个文件通过删除 .c 扩展名并附加 _new.c 来重命名它。

选择最适合您的系统和偏好的方法。批量重命名文件时请务必小心谨慎,并考虑在安全的环境中进行测试或创建备份。

答案4

Bash 有一个正则表达式匹配运算符,当与扩展测试括号内的=~括号中的 RegEx 捕获组一起使用时,会将与每个捕获组匹配的部分存储在一个特殊数组中(...)[[ ... ]]BASH_REMATCH作为从索引开始的数组元素,1用于匹配第一个捕获组的部分,2对于第二个捕获组,依此类推...因此,您可以使用正则表达式匹配,如下所示:

for f in *.c
  do 
    if [[ "$f" =~ ^(.*)(\.c)$ ]] 
      then
      [ ! -d "${BASH_REMATCH[1]}_new${BASH_REMATCH[2]}" ] && \
      [ -f "$f" ] && \
      echo mv -nv -- "$f" "${BASH_REMATCH[1]}_new${BASH_REMATCH[2]}"
      fi
    done

注意echo为了安全的试运行而添加...当对输出满意时,将其删除以进行实际的重命名。

示范:

$ touch file{1..3}.c
$ 
$ for f in *.c
  do 
    if [[ "$f" =~ ^(.*)(\.c)$ ]] 
      then
      [ ! -d "${BASH_REMATCH[1]}_new${BASH_REMATCH[2]}" ] && \
      [ -f "$f" ] && \
      mv -nv -- "$f" "${BASH_REMATCH[1]}_new${BASH_REMATCH[2]}"
      fi
    done
renamed 'file1.c' -> 'file1_new.c'
renamed 'file2.c' -> 'file2_new.c'
renamed 'file3.c' -> 'file3_new.c'
$
$ ls -l
total 0
-rw-rw-r-- 1 ubuntu ubuntu 0 Nov 25 14:25 file1_new.c
-rw-rw-r-- 1 ubuntu ubuntu 0 Nov 25 14:25 file2_new.c
-rw-rw-r-- 1 ubuntu ubuntu 0 Nov 25 14:25 file3_new.c

相关内容