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_HH24
REPORT_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では、以前のバージョンの代わりに(nawk
Solarisシステムで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