3

ファイルのリストを取得して名前を変更し、ファイル名の数字を増やしようとしています。ディレクトリには、次のような名前のファイルが多数含まれています。

senreg1.csv      senreg2.csv              senreg10.csv
senreg1.csv.1    senreg2.csv.1            senreg10.csv.1
senreg1.csv.2    senreg2.csv.2            senreg10.csv.2
senreg1.csv.3    senreg2.csv.3      ...   senreg10.csv.3
senreg1.csv.4    senreg2.csv.4            senreg10.csv.4
...              ...                      ...
senreg1.csv.10   senreg2.csv.10           senreg10.csv.10
senreg1.csv.11   senreg2.csv.11           senreg10.csv.11

末尾が 3 以上のすべてのファイルをインクリメントして、接尾辞 3 の新しいファイルを挿入できるようにしたいので、名前を変更するすべてのファイル名を含む「renames.txt」というテキスト ファイルを作成しました。次に、for ループを使用して実際の名前変更を試みました。

for f in `cat renames.txt`
do
    newfile=`echo $f | awk 'BEGIN { FS = "."}; { printf $1 "." $2 "." $3+1 }'`
    mv "$f" "$newfile"
done

私は次のようなものになりたい:

senreg1.csv      senreg2.csv              senreg10.csv
senreg1.csv.1    senreg2.csv.1            senreg10.csv.1
senreg1.csv.2    senreg2.csv.2            senreg10.csv.2
senreg1.csv.4    senreg2.csv.4      ...   senreg10.csv.4
senreg1.csv.5    senreg2.csv.5            senreg10.csv.5
...              ...                      ...
senreg1.csv.11   senreg2.csv.11           senreg10.csv.11
senreg1.csv.12   senreg2.csv.12           senreg10.csv.12

しかし、代わりに私は得る:

senreg1.csv      senreg2.csv              senreg10.csv
senreg1.csv.1    senreg2.csv.1            senreg10.csv.1
senreg1.csv.2    senreg2.csv.2     ...    senreg10.csv.2
senreg1.csv.12   senreg2.csv.12           senreg10.csv.12

senregX.csv.12 の内容は元の senregX.csv.3 と同じです。この説明が理にかなっていることを願っています。ここで何が起こっているか知っている人はいますか?

4

2 に答える 2

1

ファイルの名前を逆に変更する必要があります。

11 -> 12
10 -> 11
9 -> 10

等々。

于 2013-01-16T03:22:55.560 に答える
0

このスクリプトは、一時ファイルを使用せずに、さまざまなソリューションを提供するだけで、必要なことを行います。

#!/bin/bash
for file in $(ls -1 *[0-9]) # list files ending with a number
do 
  # get file name and id
  name=$(echo $file | sed 's/\(.*\)\.\([0-9]\+\)$/\1/g');
  id=$(echo $file | sed 's/.*\.\([0-9]\+\)$/\1/g');

  if [ $id -ge 3 ]
  then
    ((id += 1))

    # We need to backup the files because we may override some files
    cp  $file  "_$name.$id"
  fi
done


# remove old files
for file in $(ls -1 [!_]*[0-9])
do 
  id=$(echo $file | sed 's/.*\.\([0-9]\+\)$/\1/g');

  if [ $id -ge 3 ]
  then
    rm $file;
  fi
done


# finish
for file in $(ls -1 _*[0-9])
do 
  name=$(echo $file | tr -d '_');
  mv "$file" "$name";
done
于 2013-01-16T04:00:36.177 に答える