需要帮助编写一个bash脚本,它将重命名作为文件名输出的文件.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
这会将后缀更改回原始但无法弄清楚如何在扩展名之前命名日期(fname ??)
答案 0 :(得分:1)
仅限Bash解决方案:
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)
注意:
-d ''
为您提供与-d $'\0'
答案 1 :(得分:1)
您可以使用正则表达式匹配来拉开原始文件名:
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
答案 2 :(得分:0)
首先创建文件列表并重定向到文件。 ls&gt; Filelist.txt中
打开文件并在Perl中逐行阅读。使用正则表达式匹配文件的各个部分并像这样捕获它们
my ($fileName,$suffix,$date)=($WholeFileName=~/(.*)\.(.*)\.(.*)/);
这应该为您捕获三个单独的变量。现在您需要做的就是将旧文件移动到新文件名。新文件名将是您获得的上述三个变量的串联。 $ newFileName = $文件名。 “ ”$日期。“。” $后缀。如果您有一个示例fileName发表评论,我可以回复一个简短的脚本。 Perl不是唯一的方法。您可以使用bash或awk并找到其他方法来执行此操作。
答案 3 :(得分:0)
剪切文件名的每一部分:
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}
答案 4 :(得分:0)
rename --no-act 's/\(name-regex\).\(suffix-regex\).\(date-regex\)/\1.\3.\2' *
调整三个正则表达式以适合您的文件名,并在对结果感到满意时删除--no-act
以实际重命名文件。