使用shell脚本更改文件扩展名

时间:2012-03-06 19:59:38

标签: linux shell unix

如何将目录中所有* .dat文件的扩展名更改为* .txt。 Shell脚本应将目录名称作为参数。能够 将多个目录作为参数。打印命令日志 导致带有日期和时间戳的附加模式。

9 个答案:

答案 0 :(得分:19)

Batch File Rename By File Extension in Unix

# change .htm files to .html
for file in *.htm ; do mv $file `echo $file | sed 's/\(.*\.\)htm/\1html/'` ; done

# change .html files to .htm
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1htm/'` ; done

#change .html files to .shtml
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1shtml/'` ; done

#change .html files to php
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1php/'` ; done

so ==>

# change .dat files to .txt
for file in *.dat ; do mv $file `echo $file | sed 's/\(.*\.\)dat /\1txt/'` ; done

答案 1 :(得分:11)

Bash可以完成所有繁重的工作,例如提取扩展和标记新的扩展。例如:

for file in $1/*.dat ; do mv "$file" "${file%.*}.txt" ; done

答案 2 :(得分:8)

#!/bin/bash
for d in $*; do
    for f in $(ls $d/*.dat); do
        echo $(date) $(mv -v $f ${f%.dat}.txt)
    done
done

输出重定向应该在运行脚本时由shell完成

退出参数有效性检查

答案 3 :(得分:2)

简单的脚本:

#!/bin/bash

if [ $# -lt 2 ] then
    echo "Usage `basename $0` <any number of directories space separated>"
    exit 85              # exit status for wrong number of arguments.
fi

for directories
do
    for files in $(ls $directories/*.dat); do
        echo $(date) $(mv -v $files ${files%.dat}.txt)
    done
done

默认循环的第一个for循环在$@上传递,即传递的命令行参数。

答案 4 :(得分:1)

按照Pben的解决方案,如果你的文件名包含空格,你应该对变量使用双引号,如下所示:

#remove the space in file name
#example file name:19-014-0100.mp3 .mp3
#result file name:19-014-0100.mp3
$ for file in *.mp3 ; 
    do target=`echo "$file" | sed 's/ //g'`;
    echo "$target"; 
    mv "$file" "$target"; 
done;

#remove the duplicate file extension in file name
#example file name:19-014-0100.mp3.mp3
#result file name:19-014-0100.mp3
$ for file in *.mp3 ; 
    do target=`echo "$file" | sed 's/\.mp3\.mp3$/.mp3/g'`;
    echo "$target"; 
    mv "$file" "$target"; 
done;

答案 5 :(得分:0)

脚本,首先找到给定扩展名。 它从名称中删除了扩展名。然后添加反斜杠() 用于识别终端。

然后执行'mv'命令。 这里'.temp'文件夹用于隐藏用户的进程, 在GUI中。

#!/bin/sh
if [ $# -ne 3 ] 
then
    echo "Usage:  ./script folder current_extension modify_extension"
    exit
fi
mkdir .temp
find $1 -name "*.$2" > .temp/output_1 && sed "s/$2//" .temp/output_1 > .temp/output_2 && sed -e "s/[ \t]/\\\ /g" .temp/output_2 > .temp/output_3
while read line
do
    mv -v "$line""$2" "$line""$3"
done < .temp/output_3
rm -rf .temp

输出文件保存在'.temp'文件夹中,稍后删除'.temp'文件夹。

答案 6 :(得分:0)

最高投票的答案并不适合我。我可能做错了什么。我的方案是尝试创建一个具有原始名称的文件,但附加了日期,同时将扩展名从.xslx更改为.csv。这对我有用:

csvname=`echo $xlsx |sed 's/\.xlsx//'`"-$now"`echo $xlsx | sed 's/\(.*\.\)xlsx/\.csv/'`

因此,对于目录中的所有.dat文件(没有添加日期),您可以运行以下内容:

for i in *.dat
do mv $i `echo $i |sed 's/\.dat//'``echo $i | sed 's/\(.*\.\)dat/\.txt/'`
done

从上面开始,这部分代码刚刚删除了扩展名:

echo $i |sed 's/\.dat//'

此部分将.dat更改为.txt:

echo $i | sed 's/\(.*\.\)dat/\.txt/'

通过将它们彼此相邻碰撞,它将两个输出连接成文件名。就像这样做:

mv [filename][.dat] [filename] + [.txt]

尽管如此,我确实使用了STDOUT而不是'mv'命令。

答案 7 :(得分:0)

按照命令将文件扩展名.c更改为.h

find . -depth -name "*.c" -exec sh -c 'dname=$(dirname {}) && fname=$(basename {} .c) && mv {} $dname/$fname.h' ";"

答案 8 :(得分:0)

要重命名(更改扩展名)epub文件上的所有html文件,我使用此命令行:

find . -name "*.html*" -exec rename -v 's/\.html$/\.epub/i' {} \;