이름의 일부를 제거하여 디렉토리 이름 바꾸기

이름의 일부를 제거하여 디렉토리 이름 바꾸기

다음과 유사한 디렉터리가 많이 있습니다.

./parent/inventory_control-8118c470fa3811ed9add1fef7e5ef70f/snapshots/automation
./parent/configuration_data-6be54fa0fa3e11ed9add1fef7e5ef70f/snapshots/automation
./parent/zip_code-940ac1d0fa3f11ed9add1fef7e5ef70f/snapshots/automation

디렉터리 이름에서 하이픈과 uuid를 제거하여 디렉터리 이름을 바꾸고 싶습니다. 원하는 출력은

./parent/inventory_control/snapshots/automation
./parent/configuration_data/snapshots/automation
./parent/zip_code/snapshots/automation

모든 디렉토리를 찾아 이름을 바꾸는 한 줄 명령을 제안할 수 있습니까? 아니면 bash 스크립트도 도움이 될 수 있습니다.

답변1

 for f in ./parent/*; do mv "$f" "${f%%-*}"; done

(딸꾹질)

답변2

사용진주의rename(모든 운영 체제에서 작동):

rename -n 's/-*//' ./parent/*/

또는

rename -n 's@-[[:xdigit:]]+/snapshots/@/snapshots/@' ./parent/*/snapshots/

스위치 삭제 -n, 일명.시운전당신의 시도가 만족스러울 때실제 이름으로 변경.

의미가 있다면 32진수 조건을 추가할 수 있습니다.

rename -n 's@-[[:xdigit:]]{32}/snapshots/@/snapshots/@'

답변3

zsh 쉘 사용:

autoload -Uz zmv
zmv -n '(**/)(?*)-[[:xdigit:]](#c32)(#q/)' '$1$2'

( -n만족하면 삭제(시운전))

  • autoload기능을 zmv다음과 같이 표시하십시오.자동으로 로드 가능이는 함수가 처음 호출될 때 함수의 코드가 디렉토리의 파일에서 로드된다는 것을 의미합니다 $fpath. 를 사용하면 -U로드 시 별칭 확장이 완료되지 않고, 를 사용하면 -z에 로드됩니다.zsh 시뮬레이션, 기본 옵션 세트를 사용합니다. 이러한 보호 기능은 모두 기능 동작에 영향을 미치는 사용자 정의를 방지하기 위한 것입니다. 이 기능을 자주 사용하는 경우 ~/.zshrc.
  • zmv 'pattern' 'expression'일치하는 파일 찾기무늬결과에 따라 이름을 바꿉니다.표현하다
  • (**/): 디렉터리 수준을 일치시키고 $1.
  • (?*): 에 캡처된 최소 하나의 문자입니다 $2.
  • [[:xdigit:]](#c32)c소수점 이하 자릿수32xdigit
  • (#q/)q파일 형식 일치를 제한하는 한정자목차.
  • $1$2대체를 계산합니다.

zmvdir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888파일은 깊이 우선 처리되므로 디렉토리가 있으면 먼저 이름을 변경 한 다음 으로 dir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888이름을 변경합니다 .dir/a-FeedADeadBeef654321BadFadedDecaf/bdir/a-FeedADeadBeef654321BadFadedDecafdir/a

또한 모든 교체를 먼저 수행하고 데이터 손실을 방지하기 위해 이름 바꾸기를 시작하기 전에 충돌을 확인합니다.

관련 정보