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