我想编写一个linux脚本,将所有文件移动或复制到具有相同文件名(但扩展名不同)的所有文件,同时保留其不同的扩展名。换句话说:
如果我从目录列表开始:
file1.txt, file1.jpg, file1.doc, file12.txt, file12.jpg, file12.doc
我想编写一个脚本来更改所有文件名而不更改扩展名。对于同一示例,选择file2作为新文件名,结果为:
file2.txt, file2.jpg and file2.doc, file12.txt, file12.jpg, file12.doc
因此,不会更改文件名与当前条件不匹配的文件。
祝福,
乔治
答案 0 :(得分:5)
注意:如果变量file1.doc
中有i
,则表达式${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
答案 1 :(得分:4)
util-linux-ng软件包(大多数linux风格默认安装它)都有命令'rename'。有关使用说明,请参阅man rename
。使用它可以简单地完成您的任务(rename file1 file2 file1.*
答案 2 :(得分:0)
要处理基本名称包含特殊字符的输入文件,我会将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美元左右的额外报价。