使用 bash 更正文件编号
Correcting file numbers using bash
我在这样的文件夹中有一堆文件名:
test_07_ds.csv
test_08_ds.csv
test_09_ds.csv
test_10_ds.csv
...
我想减少每个文件的数量,这样就变成了:
test_01_ds.csv
test_02_ds.csv
test_03_ds.csv
test_04_ds.csv
...
这是我想出的:
for i in /*; do
n=${i//[^0-9]/};
n2=`expr $n - 6`;
if [ $n2 -lt 10 ]; then
n2="0"$n2;
fi
n3=`echo $i | sed -r "s/[0-9]+/$n2/"`
echo $n3;
cp $i "fix/$n3";
done;
有更简洁的方法吗?
可以用awk
来简化:
for f in *.csv; do
mv "$f" $(awk 'BEGIN{FS=OFS="_"} { = sprintf("%02d", -6)} 1' <<< "$f")
done
能否请您尝试以下代码,如果对您有帮助,请告诉我。
awk 'FNR==1{OLD=FILENAME;split(FILENAME, A,"_");A[2]=A[2]-6;NEW=A[1]"_"A[2]"_"A[3];system("mv " OLD " " NEW);close(OLD)}' *.csv
我还假设你的文件总是从 _7 名称开始,所以我从它们的每个名称中减去 6,以防你可以将完整路径放在 mv 命令中,该命令位于系统 awk 的内置之上实用程序,也可以将文件移动到另一个地方。到时候告诉我进展如何。
这可能有帮助:
shopt -s extglob
for i in test_{07..10}_ds.csv; do
IFS=_ read s m e <<<"$i"; # echo "Start=$s Middle=$m End=$e"
n=${m#+(0)} # Remove leading zeros to
# avoid interpretation as octal number.
n=$((n-6)) # Subtract 6.
n=$(printf '%02d' "$n") # Format `n` with a leading 0.
# comment out the next echo to actually execute the copy.
echo \
cp "$i" "fix/${s}_${n}_${e}";
done;
或者一起折叠起来
#!/bin/bash
shopt -s extglob
for i in ${1:-.}/*; do # will default to pwd `.`
IFS=_ read s m e <<<"$i"; # echo "Start=$s Middle=$m End=$e"
n=$(printf '%02d' "$((${m#+(0)}-6))")
cp "$i" "fix/${s}_${n}_${e}";
done;
我在这样的文件夹中有一堆文件名:
test_07_ds.csv
test_08_ds.csv
test_09_ds.csv
test_10_ds.csv
...
我想减少每个文件的数量,这样就变成了:
test_01_ds.csv
test_02_ds.csv
test_03_ds.csv
test_04_ds.csv
...
这是我想出的:
for i in /*; do
n=${i//[^0-9]/};
n2=`expr $n - 6`;
if [ $n2 -lt 10 ]; then
n2="0"$n2;
fi
n3=`echo $i | sed -r "s/[0-9]+/$n2/"`
echo $n3;
cp $i "fix/$n3";
done;
有更简洁的方法吗?
可以用awk
来简化:
for f in *.csv; do
mv "$f" $(awk 'BEGIN{FS=OFS="_"} { = sprintf("%02d", -6)} 1' <<< "$f")
done
能否请您尝试以下代码,如果对您有帮助,请告诉我。
awk 'FNR==1{OLD=FILENAME;split(FILENAME, A,"_");A[2]=A[2]-6;NEW=A[1]"_"A[2]"_"A[3];system("mv " OLD " " NEW);close(OLD)}' *.csv
我还假设你的文件总是从 _7 名称开始,所以我从它们的每个名称中减去 6,以防你可以将完整路径放在 mv 命令中,该命令位于系统 awk 的内置之上实用程序,也可以将文件移动到另一个地方。到时候告诉我进展如何。
这可能有帮助:
shopt -s extglob
for i in test_{07..10}_ds.csv; do
IFS=_ read s m e <<<"$i"; # echo "Start=$s Middle=$m End=$e"
n=${m#+(0)} # Remove leading zeros to
# avoid interpretation as octal number.
n=$((n-6)) # Subtract 6.
n=$(printf '%02d' "$n") # Format `n` with a leading 0.
# comment out the next echo to actually execute the copy.
echo \
cp "$i" "fix/${s}_${n}_${e}";
done;
或者一起折叠起来
#!/bin/bash
shopt -s extglob
for i in ${1:-.}/*; do # will default to pwd `.`
IFS=_ read s m e <<<"$i"; # echo "Start=$s Middle=$m End=$e"
n=$(printf '%02d' "$((${m#+(0)}-6))")
cp "$i" "fix/${s}_${n}_${e}";
done;