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