ファイル名の特定の部分で特定の文字を変更する

ファイル名の特定の部分で特定の文字を変更する

Solarisには、これを正常に実行するスクリプトがあります。

USER,REPORT_NAME,DD:MM:HH24.pdf -> USER,REPORT_NAME,DD_MM_HH24.pdf

1行は次のとおりです。

for f in *:*; do mv "$f" $(echo "$f" | tr ':' '_'); done

ただし、この操作を元に戻して作成日ごとにフィルタリングする必要があります(例:過去15日間に生成されたレポート)。そのため、過去15日間に生成されたレポートの名前を次のように変更する必要がありました。

USER,REPORT_NAME,DD_MM_HH24.pdf -> USER,REPORT_NAME,DD:MM:HH24.pdf

ファイル名部分を変更せずに_その部分の文字()のみを変更するにはどうすればよいですか?変更した日付でレポートをフィルタリングしますか?DD_MM_HH24REPORT_NAME

考えられる解決策: 私はあまりエレガントな解決策を思い出しました。コマンドを2回実行します。毎回最後の「_」項目を置き換えます。

$ echo "ADMIN,IN_CO_GE,17-09-2015,11_17_06.pdf" |  sed 's/\(.*\)_/\1:/'
ADMIN,IN_CO_GE,17-09-2015,11_17:06.pdf
$ echo "ADMIN,IN_CO_GE,17-09-2015,11_17:06.pdf" |  sed 's/\(.*\)_/\1:/'
ADMIN,IN_CO_GE,17-09-2015,11:17:06.pdf

最後の解決策 Chaosのおかげで、これは私の問題に対する最終的な解決策です。

for f in *; do mv "$f" $(echo "$f" | nawk -F, '{OFS=",";gsub(/_/, ":", $NF)}1'); done

答え1

次の目的で使用できますawk

for f in *; do
  mv "$f" $(echo "$f" | awk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done

これは置き換えます_が、:次に区切られた最後のフィールドにのみ当てはまります,

  • -F,awk■区切り文字を次のように設定します。,
  • OFS=",";出力フィールド区切り文字を次のように設定します。,
  • gsub(...)最後のフィールドのすべての内容を_次に置き換えます。:$NF
  • 最後の条件1はtrueで、awk行全体を印刷します。

編集する:Solarisでは、以前のバージョンの代わりに(nawkSolarisシステムでawkこの機能を備えた唯一の機能)を使用する必要があります。gsub()awk

for f in *; do
  mv "$f" $(echo "$f" | nawk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done

編集2:mtimeが30日以降のファイルの場合:

for f in *; do
  [ $(stat -c %Y "") -gt $(expr $(date +%s) - 30 \* 86400) ] && \
    mv "$f" $(echo "$f" | nawk -F, '{OFS=",";gsub(/_/, ":", $NF)}1')
done

関連情報