파일 및 디렉터리 이름의 해시 패턴을 바꾸는 방법

파일 및 디렉터리 이름의 해시 패턴을 바꾸는 방법

방금 메모를 백업했어요개념, 노트 이름에 해시 코드를 사용하여 명백히 고유하게 만듭니다.

예를 들어 다음은 일부 주석이 포함된 주석 폴더일 수 있습니다.

Archive e74f698cb73b42c790d08999bdbe47e4
├── Note 1 cda63bef095a493f9847d516cf34fa5f.md
├── Note 2 dda63bef095a493f9847d516cf34fa5f.md

(때로는 .csv양식 파일이기도 함)

패턴을 대체하기 위해 정규식을 사용하려고 하는데 [a-z0-9]{32}작동하는 데 문제가 있습니다 s/.

find -type f -print0 | xargs -0 rename 's/[a-z0-9]{32}//g'

-print0( 그리고 의 목적이 무엇인지 잘 모르겠습니다 -0.)

위의 코드는 파일에서만 작동하지만 비슷한 접근 방식을 사용해 보았지만 mv $f ${f:0:-34}작동하지 못했습니다. s를 사용하지 않고 파일과 폴더를 한 줄로 바꾸는 방법이 있습니까 for?

나는 StackOverflow에서 이 질문에 대한 다른 많은 답변을 시도했지만 지금까지 찾은 거의 모든 답변은 파일을 다루거나 고정 단어를 패턴으로 사용합니다.

Mass-Move 명령줄 도구( )를 사용하고 싶은데 mmvArch Linux용 공식 배포판이 없나요?

답변1

참고: 다음은 "파일에 적용"을 관찰한 대로 Perl 기반 명령 rename을 사용하고 있다고 가정합니다.rename 's/[a-z0-9]{32}//g'바라보다


디렉토리와 파일을 찾으려면 제한 사항을 제거해야 합니다 -type f.

또한 파일을 포함하기 전에 디렉터리 이름이 바뀌는 것을 방지해야 합니다. GNU를 사용하면 깊이 우선 순회를 지정하여 find이 작업을 수행할 수 있습니다 .-depth

rename마지막으로 명령이 경로 구성 요소가 아닌 파일 기본 이름에서만 작동하는지 확인해야 합니다 . rename구현에서는 이를 수행하는 옵션(예: -d, --filename, --nopath) 을 제공할 수 있지만 작업을 통해 직접 호출 --nofullpath할 수도 있습니다 .renamefind-execdir

그래서

find . -depth -execdir rename -n 's/ [a-z0-9]{32}//' {} +

( -n제안된 대안에 만족하면 제거하세요). g파일당 패턴의 단일 인스턴스를 바꾸는 데 교체 플래그가 필요하지 않습니다 .

[a-z0-9]로 대체하는 것을 고려해 볼 수도 있습니다 [[:xdigit:]].

또한보십시오:

관련 정보