패턴을 기반으로 디렉터리 이름 바꾸기

패턴을 기반으로 디렉터리 이름 바꾸기

모두 이름을 바꾸고 싶어요목차동일한 디렉터리에서 디렉터리가 패턴과 일치하는 경우 찾을 패턴은 다음과 같습니다. user1 [files.sentfrom.com] - 예: 디렉터리 이름은 다음과 같습니다.

user1 [files.sentfrom.com] - Directory-Subject

목차 전 이미지 입니다. 이전 이미지

디렉터리 이름을 다음으로 바꾸고 싶습니다.

Directory-Subject (this could have different type of text)

이것은 디렉터리 이름을 바꾼 후의 이미지입니다. 디렉터리에 있는 다른 폴더나 파일의 이름은 바뀌지 않습니다. 이름을 바꾼 후의 이미지는 다음과 같습니다. 디렉터리의 다른 이름은 바뀌지 않습니다.

정규식을 사용하여 한 번에 이 작업을 수행할 수 있습니까? 아니면 for 루프가 필요합니까? 나는 또한 다른 방법으로 열려 있습니다.

감사해요

답변1

for name in *\[*\]\ -\ *; do
  if [[ -d "$name" ]] && [[ ! -e "${name#* - }" ]]; then
    mv "$name" "${name#* - }"
  fi
done

위의 루프는 작동 bash하거나 ksh93적어도 파일 이름 와일드카드 패턴 *\[*\]\ -\ *(대괄호와 공백은 쉘에서 이스케이프해야 함)과 일치하는 현재 디렉터리의 모든 이름을 반복하고 해당 디렉터리가 디렉터리이고 수정된 디렉터리를 사용할 수 있는지 확인하기 위해 테스트합니다. 이름이 아직 존재하지 않습니다. 모든 것이 순조롭게 진행되면 디렉토리 이름이 변경됩니다.

매개변수 확장은 ${name#* - }변수의 값을 가져와서 변수의 시작 부분부터 첫 번째 발생 부분(공백-대시-공백)까지 모든 것을 name제거합니다 .␣-␣

답변2

다음을 위해 사용할 수 있습니다 rename:

rename 's/.* ([^ ]*)$/$1/' *

마지막 공백까지 디렉토리의 모든 파일 이름에서 모든 문자를 제거합니다.

답변3

찾기 및 이름 바꾸기는 강력한 팀입니다. 이 -0옵션을 사용하면 가능한 모든 파일 이름이 깔끔하게 처리됩니다.

find -maxdepth 1 -type d -print0 | xargs -0 rename s/.*Directory-/Directory-/

관련 정보