파일 이름에서 날짜와 시간을 반복적으로 제거합니다.

파일 이름에서 날짜와 시간을 반복적으로 제거합니다.

다음 형식의 파일 폴더가 포함된 폴더가 있습니다.

resultstatsDF_iris_2017-05-26--21-33-35-437096_methodnr-2_percentage-0.05_seed-0.wcr

나는 이들 각각의 날짜와 시간을 제거하고 싶으므로 이 경우에는 다음과 같은 결과를 얻습니다.

resultstatsDF_iris_methodnr-2_percentage-0.05_seed-0.wcr

Bash에서 이 작업을 어떻게 수행합니까?

답변1

정말로 하고 싶다면"배쉬와 함께", 그 다음에

find . -name '*.wcr' -execdir bash -c '
  shopt -s extglob; for f; do echo mv -- "$f" "${f/_+([0-9-])_/_}"; done
' bash {} +

+([0-9-])이는 세트에서 발생하는 하나 이상의 문자와 일치하는 확장된 glob에 의존합니다.[0-9-]

${f/_2017+([0-9-])_/_}예를 들어 단순히 숫자와 대시를 일치시키는 것이 너무 일반적인 경우 대체를 더 구체적으로 만들 수 있습니다 .

참고: 삭제 echo 일단 당신이 원하는 일을 하고 있다는 것을 확신하세요.

답변2

find+ 사용prename(Perl 이름 바꾸기) 명령:

find yourfolder -type f -name "*.wcr" -exec prename 's/^(.+)_[0-9]{4}-[0-9]{2}-[0-9]{2}[^_]+(_.*)$/$1$2/' {} +

prename조치를 취하지 않고 결과를 보려면 -n옵션(이름을 바꾸지 않고 이름을 바꿀 파일 이름을 인쇄하십시오.):

man rename

  • [0-9]{4}-[0-9]{2}-[0-9]{2}- 패턴 포인팅날짜-유사 하위 문자열(예 2017-05-26: )

답변3

사용펄 이름 바꾸기명령(모든 변형, 단 util-linux 제외 rename):

find . -type f -name \*.wcr -exec rename 's/_\d{4}-(\d{2}-){2}-(\d{2}-){3}\d+_/_/' {} +

답변4

파일이 항상 하나의 디렉터리 깊이인 경우 다음과 같은 모드를 사용할 수 있습니다 for x in */*_20*_*. 사용할 모드는 이름을 바꾸고 싶지 않은 다른 파일이 있을 수 있는 가능성에 따라 다릅니다. 방금 제시한 패턴은 날짜가 다음으로 시작 20하고 이름에 포함된 모든 파일 _20과 그 이후의 삭제 취소 항목의 이름을 바꿔야 한다고 가정합니다.

이름을 바꾸려면 쉘 루프를 사용할 수 있습니다매개변수 확장새 파일 이름을 빌드하기 위한 구성입니다.

for old_name in ./*/*_20_*_*; do
  base=${old_name##*/}        # remove the directory part
  prefix=${base%%_20*}        # remove everything from _20
  suffix=${base#*_20}         # remove everything up to _20
  suffix=${suffix#*_}         # ... then everything before the first remaining _
  mv "$old_name" "${old_name%/*}/${prefix}_${suffix}"
done

파일의 깊이가 다른 경우 bash ≥4.3에서는 shopt -s globstarthen 을 실행할 수 있습니다 for x in **/*_20*_*; …. 이것무늬**globstar켜져 있으면 모든 디렉터리 깊이와 일치합니다. 이는 bash 4.0~4.2에서도 작동하지만 디렉터리의 심볼릭 링크도 통과한다는 점에 유의하세요. 이것은 경고 없이 zsh 및 ksh에서도 작동하며 zsh에서도 즉시 작동하고 set -o globstarksh에서도 작동합니다.

관련 정보