여러 하위 디렉터리를 새 위치로 이동하고 이름 바꾸기

여러 하위 디렉터리를 새 위치로 이동하고 이름 바꾸기

내 디렉토리는 다음과 같이 설정됩니다.

  • dir 1
    • 001
      • 11-20-2001-RT SIMULATION-57976
    • 002
      • 11-20-2001-RT SIMULATION-30560
    • 003
      • 08-24-1998-RT SIMULATION-72882

잠깐, 약 250개의 항목이 있습니다. 내 목표는 문자열이 포함된 각 하위 디렉터리를 RT SIMULATION다른 디렉터리로 이동하는 것입니다. 즉 dir 2, 이름을 해당 상위 디렉터리로 바꾸는 것입니다. 그래서 찾고 있어요.

  • dir 2
    • 001(* 11-20-2001-RT SIMULATION-57976위 예시와 일치해야 합니다)
    • 002
    • 003

지금까지 RT SIMULATION이 코드를 사용하여 이러한 디렉토리를 찾을 수 있습니다.for i in $(find /dir1/*/* -name "*RT SIMULATION*" -type d); echo "$i"; done;

dir 2이제 위에 지정된 상위 디렉터리를 기반으로 이러한 디렉터리를 이동하고 이름을 바꿔야 합니다 . 도움이나 조언이 있습니까?

답변1

그리고 zsh:

autoload -Uz zmv
zmv 'dir 1/(*)/*RT SIMULATION*(#q/)' 'dir 2/$1'

를 사용해야 bash하고 GNU 시스템을 가정하면 다음과 같은 작업을 수행할 수 있습니다.

(
  shopt -s nullglob
  ret=0
  for dir in 'dir 1'/*/*'RT SIMULATION'*; do
    [[ -d $dir && ! -L $dir ]] || continue
    parent=${dir%/*}; parent=${parent##*/}
    mv -iT -- "$dir" "dir 2/$parent" || ret=$?
  done
  exit "$ret"
)

그건 그렇고, 참조하십시오찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?당신의 for i in $(find....

답변2

find이를 수행 하려면 Perl 버전을 사용할 수 있습니다 rename. 예를 들어:

먼저 테스트 환경을 설정해야 합니다.

$ mkdir /tmp/goldenburrito
$ cd /tmp/goldenburrito
$ mkdir -p 'dir1/001/11-20-2001-RT SIMULATION-5797' \
    'dir1/002/11-20-2001-RT SIMULATION-30560' \
    'dir1/003/08-24-1998-RT SIMULATION-72882'
$ mkdir dir2

그런 다음 "RT SIMULATION" 하위 디렉터리의 이름을 바꿉니다.

$ find dir1 -mindepth 2 -maxdepth 2 \
    -type d -name '*RT SIMULATION*' -print0 | 
        rename -0 -n 's:(/\d{3})/.*:$1:; s/^dir1/dir2/'
rename(dir1/003/08-24-1998-RT SIMULATION-72882, dir2/003)
rename(dir1/002/11-20-2001-RT SIMULATION-30560, dir2/002)
rename(dir1/001/11-20-2001-RT SIMULATION-5797, dir2/001)

-mindepth 2아래의 두 번째 수준 디렉터리로만 일치를 제한하기 위해 및 옵션 과 함께 사용됩니다 . NUL로 구분된 출력은 스크립트로 파이프됩니다(파일 및 디렉터리 이름은 명령줄 인수로 전달되거나 표준 입력에서 전달될 수 있음).-maxdepth 2finddir1findrename

일치하는 각 디렉터리 이름에 대해 rename스크립트는 먼저 3자리 디렉터리 이름 뒤의 모든 항목을 제거한 다음 디렉터리 이름 시작 부분의 "dir1"을 "dir2"로 변경합니다.

rename이 옵션 은 -n시험 실행이므로 실제로 디렉터리 이름을 바꾸지 않고 수행할 작업만 표시합니다. 요구사항을 충족하는 것으로 확인되면 삭제 -n하거나 로 대체하여 자세한 출력을 얻으세요.-v

또한 참고: Perl은 배포 및/또는 설치 방법에 따라 , , 또는 간단히 rename이라고 불릴 수 있습니다 . 예를 들어 Debian에서는 호출되어 패키지에 위치합니다 (그래서 ).file-renameperl-renameprenamerenamerenamerenameapt-get install rename

기능과 명령줄 옵션이 완전히 다르고 호환되지 않는 rename유틸리티와 혼동 하지 마십시오.util-linux

를 실행하여 설치한 버전( 또는 언급된 rename -V경우 Perl 버전 ) 을 알 수 있습니다.perlFile::Rename

Perl 이름 바꾸기를 사용하면 임의로 복잡한 Perl 코드를 사용하여 파일 이름을 바꿀 수 있지만 s/search/replace/파일 이름에 대해 간단한 sed와 유사한 작업을 수행하는 데 가장 일반적으로 사용됩니다.

관련 정보