アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めまして。

質問ですが、UNIXコマンドでフォルダ内のファイルを全てリネームする方法が分からないので教えて下さい。

ファイルの名前は全て同じ文字数で、[***_**_**.csv]となっています。(*は半角英数字です)
リネームの内容としては、二つ目のアンダーバーからピリオドまでを消却したいと思っています。

例えばAWKコマンドで文字数から消却できるのでしょうか?
分かる方には簡単な質問で申し訳ありませんがお願いします。

A 回答 (2件)

そのディレクトリの直下だけなら


cd そのディレクトリ
\ls -1 ???_??_??.csv | sed 's/^\(.*\/\)\{0,\}\([^/_]\{3\}_[^/_]\{2\}\)_[^/_]\{2\}\(\.csv\)$/mv & \1\2\3/' | sh

そのディレクトリの下に再帰的にあるなら
find そのディレクトリ -name "???_??_??.csv" | sed 's/^\(.*\/\)\{0,\}\([^/_]\{3\}_[^/_]\{2\}\)_[^/_]\{2\}\(\.csv\)$/mv & \1\2\3/' | sh
# Tacosanさん、ちょっとお借りしてsedを直しました。

いずれも、
(1)ls/findでファイル名一覧を出力。1行に1ファイル
(2) (1)の出力をsedで受けて、 ディレクトリ(\1),ファイル名の前半(\2),後半,拡張子(\3)に分解
→mv [元のファイル名] [ディレクトリ,ファイル名の前半,拡張子] と変換して出力
(3) (2の出力を)sh で実行
です。

sedの「mv」を「mv -i 」にすれば、ファイル名が重なった場合に確認するようになります。
|shを削除すれば、事前に動作確認できます。
sedの「mv」を「mv -v 」にするか、sh のあとに -x を付ければ、実行の様子が出力されます、
    • good
    • 0

いろいろあるけどたとえば


find そこ -name '???_??_??.csv' |sed -e 's/\([^_]*_[^_]*\)\(_.*\)\(\.csv\)/mv \1\2\3 \1\3/' | sh
のような感じでもできそう. sed の正規表現は微妙なところがあるけど.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!