파일 이름의 특정 부분에서 특정 문자 바꾸기

파일 이름의 특정 부분에서 특정 문자 바꾸기

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_HH24REPORT_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,awks 구분 기호를 다음으로 설정합니다 .,
  • 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

관련 정보