Bash 将文件重命名为原始扩展名
需要有关编写bash脚本的帮助,该脚本将重命名输出为file name.suffix.date的文件。我需要将这些文件重写为name.date.suffix 编辑: 将后缀从日期更改为~ 以下是我目前掌握的情况:Bash 将文件重命名为原始扩展名,bash,Bash,需要有关编写bash脚本的帮助,该脚本将重命名输出为file name.suffix.date的文件。我需要将这些文件重写为name.date.suffix 编辑: 将后缀从日期更改为~ 以下是我目前掌握的情况: find . -type f -name "*.~" -print0 | while read -d $'\0' f do new=`echo "$f" | sed -e "s/~//"` mv "$f" "$new" done 这会将后缀改回原始名称,但无法确定如何在扩
find . -type f -name "*.~" -print0 | while read -d $'\0' f
do
new=`echo "$f" | sed -e "s/~//"`
mv "$f" "$new"
done
这会将后缀改回原始名称,但无法确定如何在扩展名(fname??)之前获取要命名的日期
my($fileName,$suffix,$date)=($WholeFileName=~/(.*)\(.*)\(.*)/)代码>
这将为您捕获三个独立的变量。现在,您只需将旧文件移到新文件名。新文件名将是上述三个变量的串联$newFileName=$fileName。“..$date.”.“..$后缀。如果你有一个示例文件名发布评论,我可以用一个简短的脚本回复。Perl不是唯一的方法。您可以使用bash或awk并找到其他方法来实现这一点
FIN=$(echo test.12345.ABCDEF | sed -e 's/[a-zA-Z0-9]*[\\.][a-zA-Z0-9]*[\\.]//')
DEBUT=$(echo test.12345.ABCDEF | sed -e 's/[\\.][a-zA-Z0-9]*[\\.][a-zA-Z0-9]*//')
MILIEU=$(echo test.12345.ABCDEF | sed -e 's/'${FIN}'//' -e 's/'${DEBUT}'//' -e 's/[\.]*//g')
echo ${DEBUT}.${FIN}.${MILIEU}
--no act
,以实际重命名文件。Bash-only解决方案:
while IFS=. read -r -u 9 -d '' name suffix date tilde
do
mv "${name}.${suffix}.${date}.~" "${name}.${date}.${suffix}"
done 9< <(find . -type f -name "*.~" -print0)
而IFS=。read-r-u 9-d“”名称后缀日期波浪号
做
mv“${name}.${suffix}.${date}.~”“${name}.${date}.${suffix}”
完成9<您可以使用正则表达式匹配分离原始文件名:
find . -type f -name "*.~" -print0 | while read -d $'\0' f
do
dir=${f%/*}
fname=${f##*/}
[[ $fname =~ (.+)\.([^.]+)\.([^.]+)\.~$ ]] || continue
name=${BASH_REMATCH[1]}
suffix=${BASH_REMATCH[2]}
d=${BASH_REMATCH[3]}
mv "$f" "$dir/$name.$d.$suffix"
done
这假设name
将不包含
。是的,它在notes部分。我得到的文件名为“test2.txt.20130320 95325.~”而不是原来的“test2.txt.20130320.~”?@jmituzas,因为您需要更精确。原始文件的全名是什么?如果它确实包含一个波浪形字符而不是日期,则需要更新您的问题。你说的“获取文件”是什么意思?我向您保证,此代码不会将test2.txt.20130320.~
重命名为test2.txt.20130320 95325.~
,如果这是您的意思的话。
find . -type f -name "*.~" -print0 | while read -d $'\0' f
do
dir=${f%/*}
fname=${f##*/}
[[ $fname =~ (.+)\.([^.]+)\.([^.]+)\.~$ ]] || continue
name=${BASH_REMATCH[1]}
suffix=${BASH_REMATCH[2]}
d=${BASH_REMATCH[3]}
mv "$f" "$dir/$name.$d.$suffix"
done