7

我想编写一个 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

因此文件名与当前条件不匹配的文件将不会被更改。

最好的祝愿,

乔治

4

3 回答 3

8

注意:如果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
于 2013-03-23T10:13:23.863 回答
4

util-linux-ng 软件包(大多数 linux 版本默认安装了它)具有命令“重命名”。请参阅man rename使用说明。使用它可以简单地完成您的任务

rename file1 file2 file1.*

于 2016-07-29T02:57:39.753 回答
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 美元左右的额外引号。

于 2015-01-14T19:02:20.073 回答