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
가능한 해결책: 나는 덜 우아한 해결책을 생각해 냈습니다. 명령을 두 번 실행합니다. 매번 마지막 "_" 항목을 바꿉니다.
$ 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
s 구분 기호를 다음으로 설정합니다 .,
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