Files

替換文件名特定部分的某些字元

  • September 22, 2015

在 Solaris 上,我有一個腳本可以成功地做到這一點:

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

單線是這樣的:

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

最終解決方案 感謝混亂,這是我的問題的最終解決方案:

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

您可以awk為此使用:

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

這將替換為_:但僅在由 分隔的最後一個欄位中,

  • -F,awks 分隔符設置為,
  • OFS=",";將輸出欄位分隔符設置為,
  • gsub(...)將最後一個欄位中的所有內容替換_:``$NF
  • 最後1是一個真實的條件,awk列印整行。

編輯:在 Solaris 上,您必須使用nawk(這是awkSolaris 系統上唯一具有該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

引用自:https://unix.stackexchange.com/questions/231236