다음 형식의 파일 폴더가 포함된 폴더가 있습니다.
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 globstar
then 을 실행할 수 있습니다 for x in **/*_20*_*; …
. 이것무늬**
globstar
켜져 있으면 모든 디렉터리 깊이와 일치합니다. 이는 bash 4.0~4.2에서도 작동하지만 디렉터리의 심볼릭 링크도 통과한다는 점에 유의하세요. 이것은 경고 없이 zsh 및 ksh에서도 작동하며 zsh에서도 즉시 작동하고 set -o globstar
ksh에서도 작동합니다.