디렉토리/파일 이름에서 특정 문자를 일괄 제거하는 방법

디렉토리/파일 이름에서 특정 문자를 일괄 제거하는 방법

Fedora 29에서 이 작업을 수행하려면 어떤 명령을 사용할 수 있습니까? [,] 및 -를 제거해야 합니다. 가능하면 문자를 제거하세요. 그렇지 않으면 기꺼이 "_"로 바꾸겠습니다. 2,400개가 넘는 파일과 디렉터리가 있으며 다음과 같은 이름의 하위 디렉터리가 있습니다.

TWENTY_ONE_PILOTS_-_DISCOGRAPHY_(2009-15)_CHANNEL_NEO]

디렉토리를 쉽게 만들 수 있으려면 필요합니다. 예를 들어:

TWENTY_ONE_PILOTS_DISCOGRAPHY_2009_15_CHANNEL_NEO

나는 시도했다:

find . -depth -name '*]*' -execdir bash -c 'for i; do mv "$i" "${i

│// /_}"; done' _ {} +

그리고

for x in *]*; do mv -- "$x" "${x//[/}"; done

엔더

rename 's/\(|\[|\]|\)//g' *

답변1

당신은 그것을 사용할 수 있습니다 : find . -exec sh -c './correct.sh {}' \;!

위 명령을 실행한 동일한 디렉터리에 올바른 .sh를 배치합니다.

#!/bin/bash

mv "$1" $(echo "$1" | sed 's/_-_/_/g');

(잊지 마요 chmod +x correct.sh!)

이것은 매우 우아한 솔루션은 아니지만 작동합니다. -exec옵션일 수 있고 find파일의 각 이름, 언급된 절차(여기 sh -c '...')에 대해 실행되고 {}를 파일 이름으로 바꾸는 것을 제외하면 모든 것이 자명합니다 ! 바라보다매뉴얼 페이지 찾기더 많은 정보를 알고 싶습니다.

파일 디렉터리 이름만 바꾸고 싶다면 -type d찾기 옵션으로 넣어주세요. 물론 필요에 따라 sed를 수정하여 원하는 것을 바꿀 수 있습니다.

답변2

그리고 zsh:

$ autoload zmv
$ zmv -n '(**/)(*)' '$1${${${2//[^.[:alnum:]]##/_}##_#}%%_#}'
mv -- TWENTY_ONE_PILOTS_-_DISCOGRAPHY_\(2009-15\)_CHANNEL_NEO\] TWENTY_ONE_PILOTS_DISCOGRAPHY_2009_15_CHANNEL_NEO

alnum을 제외한 모든 문자 시퀀스를 변환한 다음 .모든 파일 및 디렉터리에서 _선행 및 후행 s를 반복적으로 제거합니다 ._

-n이다시운전, 만족스러우면 제거하세요.

특정 유형의 파일 이름만 바꾸려는 경우목차, 다음 (**/)(*)으로 변경하세요.(**/)(*)(#q/)

관련 정보