파일 이름에서 날짜와 시간을 재귀적으로 제거

파일 이름에서 날짜와 시간을 재귀적으로 제거

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

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하고 이름에 다음이 포함되고 그 뒤에 또 다른 undescore가 포함된 모든 파일의 _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에서도 작동합니다.

관련 정보