我是awk和基于shell的编程新手。我有一堆名为file_0001.dat
,file_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
答案 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
ls -r1
以相反顺序列出文件以避免冲突file_0002.dat
将成为file_0002.dat file_0008.dat
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