Files
替換文件名特定部分的某些字元
在 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,
將awk
s 分隔符設置為,
OFS=",";
將輸出欄位分隔符設置為,
gsub(...)
將最後一個欄位中的所有內容替換_
為:``$NF
- 最後
1
是一個真實的條件,awk
列印整行。編輯:在 Solaris 上,您必須使用
nawk
(這是awk
Solaris 系統上唯一具有該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