我想编写一个linux脚本,将所有这些文件的文件名(但扩展名不同)的所有文件移动或复制到一个新的文件名,同时保持不同的扩展名。 换一种说法:
如果我从一个目录列表开始:
file1.txt, file1.jpg, file1.doc, file12.txt, file12.jpg, file12.doc
我想编写一个脚本来更改所有文件名而不更改扩展名。 对于同样的例子,selectfile2作为新文件名的结果是:
file2.txt, file2.jpg and file2.doc, file12.txt, file12.jpg, file12.doc
所以文件名不符合当前标准的文件将不会被修改。
最好的祝愿,
乔治
注意:如果变量i
有file1.doc
,则表达式${i##*.}
在这种情况下提取扩展名即doc
。
一行解决方案:
for i in file1.*; do mv "$i" "file2.${i##*.}"; done
脚本:
#!/bin/sh # first argument - basename of files to be moved # second arguments - basename of destination files if [ $# -ne 2 ]; then echo "Two arguments required." exit; fi for i in $1.*; do if [ -e "$i" ]; then mv "$i" "$2.${i##*.}" echo "$i to $2.${i##*.}"; fi done
util-linux-ng软件包(大多数Linux版本都默认安装了)包含命令“rename”。 请参阅man rename
使用说明。 使用它你的任务可以做到这一点
rename file1 file2 file1.*
要处理其基名包含特殊字符的输入文件,我将修改plesiv的脚本为以下内容:
if [ $# -ne 2 ]; then echo "Two arguments required." exit; fi for i in "$1".*; do if [ -e "$i" ]; then mv "$i" "$2.${i##*.}" echo "$i to $2.${i##*.}"; fi done
请注意$ 1附近的额外引号。