用于更改文件名的脚本

时间:2014-06-08 20:13:35

标签: awk sed echo

我是awk和基于shell的编程新手。我有一堆名为file_0001.datfile_0002.dat......file_1000.dat的文件。我想更改文件名,例如file_之后的数字与之前的文件名相比将是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

6 个答案:

答案 0 :(得分:2)

这个脚本会为你做这个技巧:

#!/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

之前的文件:

  

file_0001.dat file_0002.dat

首次执行后的文件:

  

file_0004.dat file_0008.dat

第二次执行后的文件:

  

file_0016.dat file_0032.dat

答案 1 :(得分:1)

这是一种纯粹的bash方式(没有bc,重命名或sed)。

#!/bin/bash

for i in $(ls -r *.dat); do
   prefix="${i%%_*}_"
   oldnum="${i//[^0-9]/}"
   newnum="$(printf "%04d" $(( 10#$oldnum * 4 )))"
   mv "$i" "${prefix}${newnum}.dat"
done

要测试它,你可以做到

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

答案 2 :(得分:1)

使用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

答案 3 :(得分:1)

ls -r1 | awk -F '[_.]' '{printf "%s %s_%04d.%s\n", $0, $1, 4*$2, $3}' | xargs -n2 mv

  1. ls -r1以相反顺序列出文件以避免冲突
  2. 第二部分将生成新文件名。例如:file_0002.dat将成为file_0002.dat file_0008.dat
  3. xargs -n2每次都会传递两个参数mv

答案 4 :(得分:1)

这可能对您有用:

paste <(seq -f'mv file_%04g.dat' 1000) <(seq -f'file_%04g.dat' 4 4 4000) | 
sort -r | 
sh

答案 5 :(得分:-1)

这可以提供帮助:

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