分割ファイル[az]の名前を分割ファイル[1-26]に変更する方法

分割ファイル[az]の名前を分割ファイル[1-26]に変更する方法

splitfile[a-z]フォームに名前が付けられたファイルの名前を次のように変更しようとします。つまり、名前をsplitfile[1-26].csv変更したいと思います。次のコマンドを試しました。 splitfileasplitfile1.csv

mv splitfile[a-z] splitfile[1-26].csv 

しかし、うまくいきません。助けてください。 forループを使用しようとしています。

答え1

新規の場合は、bash次の形式の中括弧拡張を使用できます{a..z}

i=1; for f in file{a..z}; do mv "$f.csv" "${f%?}$((i++)).csv"; done

答え2

perlこのユーティリティrename(とも呼ばれる)がある場合は、prenameそれを使用してファイルの名前を変更できます。

rename -n 's/([a-z])$/ord($1)-96/e and $_ .= ".csv"' splitfile?

それが行うのは、ファイル名と一致する最後の文字を取得し、文字を対応するsplitfile?ASCII序数に変換し(例:a = 97、b = 98、...)、96を減算して一致する文字を結果に置き換えることです。この置換が正常に適用されたすべてのファイル名に ".csv"文字列が追加されます。

上記のコマンドは、実際のファイルを変更せずに(-nこのフラグが実行するアクション)、単に実行するジョブを印刷します。一度実行して出力を確認してから正しい場合-n

答え3

1つを使用すると、zshループを使用する必要はなく、関数のみを使用できますzmv

autoload -U zmv
i=1 zmv -v '(file)[a-z].csv' '$1$((i++)).csv'

またはすべてfile[a-z].csv存在しない場合:

letters=({a..z})
zmv -v '(file)([a-z]).csv' '$1$letters[(i)$2].csv'

答え4

a-zすべてのファイルがシーケンスに存在すると仮定し、POSIXシェルを使用してこれを行う1つの方法は次のとおりです。

#!/bin/sh
i=1
for f in file[a-z].csv
do
    echo mv $f file$i.csv
    i=$((i+1))
done

関連情報