Awk 更改文件名的脚本

Awk 更改文件名的脚本,awk,sed,echo,Awk,Sed,Echo,我不熟悉awk和基于shell的编程。我有一堆文件名为file_0001.dat,file_0002.dat……file_1000.dat。我想更改文件名,例如,与以前的文件名相比,文件后面的数字将是4的倍数。所以我想改变 file_0001.dat to file_0004.dat file_0002.dat to file_0008.dat 等等 有人能推荐一个简单的脚本来做吗。我试过以下方法,但没有成功 #!/bin/bash a=$(echo $1 sed -e 's:file_::

我不熟悉awk和基于shell的编程。我有一堆文件名为
file_0001.dat
file_0002.dat……file_1000.dat
。我想更改文件名,例如,与以前的文件名相比,文件后面的数字将是4的倍数。所以我想改变

file_0001.dat to file_0004.dat
file_0002.dat to file_0008.dat 
等等

有人能推荐一个简单的脚本来做吗。我试过以下方法,但没有成功

#!/bin/bash
a=$(echo $1 sed -e 's:file_::g' -e 's:.dat::g')
b=$(echo "${a}*4" | bc)
shuf file_${a}.dat > file_${b}.dat

此脚本将为您完成以下操作:

#!/bin/bash
for i in `ls -r *.dat`; do
    a=`echo $i | sed 's/file_//g' | sed 's/\.dat//g'`
    almost_b=`bc -l <<< "$a*4"`
    b=`printf "%04d" $almost_b`
    rename "s/$a/$b/g" $i
done
paste <(seq -f'mv file_%04g.dat' 1000) <(seq -f'file_%04g.dat' 4 4 4000) | 
sort -r | 
sh
#/bin/bash
对于'ls-r*.dat'中的i;做
a=`echo$i|sed's/file//g'\124; sed's/\.dat//g'`
几乎_b=`bc-l这有助于:

#!/bin/bash
for i in `cat /path/to/requestedfiles |grep -o '[0-9]*'`; do
   count=`bc -l <<< "$i*4"`
   echo $count
done
#/bin/bash
对于'cat/path/to/requestedfiles | grep-o'[0-9]*'中的i;做

count=`bc-l这里是一种纯bash方式(没有bc、rename或sed)

为了测试它,你可以做

mkdir tmp && cd $_
touch file_{0001..1000}.dat
(paste code into convert.sh)
chmod +x convert.sh
./convert.sh
使用bash/sed/find:

files=$(find -name 'file_*.dat' | sort -r)
for file in $files; do
    n=$(sed 's/[^_]*_0*\([^.]*\).*/\1/' <<< "$file")
    let n*=4
    nfile=$(printf "file_%04d.dat" "$n")
    mv "$file" "$nfile"
done
files=$(find-name'file.*.dat'| sort-r)
以$files表示的文件;做

n=$(sed's/[^.]*\u 0*\([^.]*\)./\1/'
ls-r1 | awk-F'[\.]''''''{printf”%s%s\%04d.%s\n',$0,$1,4*$2,$3}';xargs-n2 mv

  • ls-r1
    以相反顺序列出文件以避免冲突
  • 第二部分将生成新文件名。例如:
    文件\u 0002.dat
    将成为
    文件\u 0002.dat文件\u 0008.dat
  • xargs-n2
    每次将向
    mv传递两个参数

  • 这可能适合您:

    #!/bin/bash
    for i in `ls -r *.dat`; do
        a=`echo $i | sed 's/file_//g' | sed 's/\.dat//g'`
        almost_b=`bc -l <<< "$a*4"`
        b=`printf "%04d" $almost_b`
        rename "s/$a/$b/g" $i
    done
    
    paste <(seq -f'mv file_%04g.dat' 1000) <(seq -f'file_%04g.dat' 4 4 4000) | 
    sort -r | 
    sh
    

    paste I cna为您提供了一个java或php脚本。您必须首先扫描文件夹并保留所有文件名,然后将它们映射到新名称,然后从最高的开始到最低的。好像从最低的开始-会有冲突。例如,如果以前有一个004,您就不能将001重命名为004。@tgkprog-看起来他想要您se-awk/sed/bash(哪些工具更适合此任务)。你应该选择一个正确的答案,为什么?从最高处开始,然后转到最低处。好像你从最低处开始-会有冲突。例如,如果以前有一个004,你就不能将001重命名为004…如果一开始你有文件_0001.dat,文件_0001.dat,…文件_0004.dat…?谢谢tgkprog-我已经更改了代码以防止出现这种情况。Thanks。