【问题标题】:A script to change file names更改文件名的脚本
【发布时间】:2014-07-29 09:48:25
【问题描述】:

我是 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

【问题讨论】:

  • 我可以帮助您为此编写一个 java 或 php 脚本。您必须先扫描文件夹并保留所有文件名,然后将它们映射到新名称,然后从最高开始到最低。好像你从最低点开始 - 会有冲突。例如,如果之前有 004,则不能将 001 重命名为 004。
  • @tgkprog - 看起来他想使用 awk/sed/bash(这是完成此任务的更好工具)。
  • 你应该选择一个正确的答案,为什么?见faq

标签: awk sed echo


【解决方案1】:

这个脚本会帮你搞定:

#!/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 文件_0002.dat

第一次执行后的文件:

file_0004.dat 文件_0008.dat

第二次执行后的文件:

file_0016.dat 文件_0032.dat

【讨论】:

  • 从高到低。好像你从最低点开始 - 会有冲突。例如,如果之前有 004,则不能将 001 重命名为 004 ...如果一开始您有 file_0001.dat、file_0001.dat、... file_0004.dat ... 怎么办?
  • 感谢 tgkprog - 我已更改代码以防止这种情况发生。谢谢。
【解决方案2】:

这是一种纯粹的 bash 方式(没有 bc、rename 或 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      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

      【讨论】:

        【解决方案5】:

        这可能对你有用:

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

        【讨论】:

          【解决方案6】:

          这会有所帮助:

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

          【讨论】:

            猜你喜欢
            • 2022-12-07
            • 2012-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-17
            • 1970-01-01
            • 2012-03-24
            • 1970-01-01
            相关资源
            最近更新 更多