![使用 find 和 mv:](https://linux22.com/image/954317/%E4%BD%BF%E7%94%A8%20find%20%E5%92%8C%20mv%EF%BC%9A.png)
我一直想给某个目录中的_new
所有文件添加后缀。例如,我希望文件名为。.c
example.c
example_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