要件が非常に単純な場合は、bashの置換のみでこれを行うことができます。
for file in `find . -name 'pippo*.txt'`; do
mv $file ${file/[0-9].txt/.txt}
done
ただし、これはファイル名の1桁を超える場合は失敗しますpippo999/pippo999.txt
。これは、extglob
オプションを設定することで対処できます。
shopt -s extglob
for file in `find . -name 'pippo*.txt'`; do
mv $file ${file/+([0-9]).txt/.txt}
done
bashファイルグロブの+(...)
構成は、が設定されている場合にのみ使用できますextglob
。
ループとでディレクトリツリーをトラバースする代わりにcd
、これはfind
関連するすべてのファイルのリストを取得するために使用し、ファイル名のリストをループします。これは次の形式になります./pippoN/pippoN.txt
。名前の変更では、bashパラメーターの置換を使用して、変更されたファイル名を取得します。ファイル名の展開も参照してください。
ファイル名またはディレクトリ名のスペースは、このアプローチを破ることに注意してください。スペースを含むfind
パスは、スペースの周りの複数のトークンに分割され、各トークンはリストイテレータの個別の結果になります。したがって、パス内のスペース文字を予測する必要がある場合、これはもう少し複雑になります。
shopt -s extglob
IFS=$'\n'
for file in `find . -name 'pippo*.txt'`; do
mv "$file" "${file/+([0-9]).txt/.txt}"
done
ここでは、mv
スペースを正しく処理するコマンドのファイル名を引用し、 IFS
bashが空白を単語の境界として認識しないようにフィールド区切り文字を変更しました。find
これにより、ループイテレータの問題が修正されます。これで、パス内のスペースが正しく処理されるようになり、たとえば、./pippo 9/pippo9.txt
名前も次のように変更されます./pippo 9/pippo.txt
。