텍스트 파일에 나열된 디렉토리에서 파일을 이동하는 Bash 스크립트

텍스트 파일에 나열된 디렉토리에서 파일을 이동하는 Bash 스크립트

나는 이와 같은 디렉토리 구조를 가지고 있습니다.

.
├── Round_1_Div2
│   ├── file1.txt
│   └── file2.txt
├── Round1Div2
│   ├── file3.txt
│   └── file4.txt
├── Round_2_Div2
│   ├── file1.txt
│   └── file2.txt
└── Round2Div2
    ├── file3.txt
    └── file4.txt

다음의 모든 파일을 변환해야 합니다.1라운드 2라운드도착하다Round_1_Div2그리고2라운드 디비전 2도착하다Round_2_Div2

나의 짧은 지식에 의하면

  find *ound[0-9]Di* > rename.txt
  sed  -e 's/ound/ound_/;s/Di/_Di/' < rename.txt > newname.txt

이름 바꾸기.txt그리고이름.txt위 명령을 실행한 후 생성됨

이름 바꾸기.txt

Round1Div2
Round2Div2

새이름.txt

Round_1_Div2
Round_2_Div2

각각에 지정된 디렉토리의 모든 파일을 이동하는 방법이름 바꾸기.txt해당 디렉토리로 이동새이름.txt??감사해요.

답변1

Perl 유틸리티( 및 rename라고도 함 ) 사용:prenamefile-rename

$ rename -n 's/Round(\d)Div(\d)/Round_$1_Div$2/' */*
rename(Round1Div2/file3.txt, Round_1_Div2/file3.txt)
rename(Round1Div2/file4.txt, Round_1_Div2/file4.txt)
rename(Round2Div2/file3.txt, Round_2_Div2/file3.txt)
rename(Round2Div2/file4.txt, Round_2_Div2/file4.txt)

-n옵션을 사용하면 시험 실행되므로 내용만 표시됩니다.회의실제로 하는 것보다 하는 것. 원하는 작업이 수행될 것이라고 확신하면 제거 -n(진행률 표시나 기타 출력 없이 파일 이름 바꾸기)하거나 -v자세한 출력으로 바꾸십시오.

$ rename -v 's/Round(\d)Div(\d)/Round_$1_Div$2/' */*
Round1Div2/file3.txt renamed as Round_1_Div2/file3.txt
Round1Div2/file4.txt renamed as Round_1_Div2/file4.txt
Round2Div2/file3.txt renamed as Round_2_Div2/file3.txt
Round2Div2/file4.txt renamed as Round_2_Div2/file4.txt

답변2

다음과 같은 것을 사용하는 것이 가장 쉬운 것 같습니다.

mv -i Round1Div2/* Round_1_Div2 && rmdir Round1Div2
mv -i Round2Div2/* Round_2_Div2 && rmdir Round2Div2

이름 충돌이 있는 경우 -i옵션은 mv파일을 덮어쓸 것인지 묻는 대화형 프롬프트를 제공해야 합니다.

숨겨진 파일 이름이 있는 경우 또는수천파일을 찾은 다음 다음을 사용할 수 있습니다 rsync.

rsync -av --ignore-existing Round1Div2/ Round_1_Div2
rsync -av --ignore-existing Round2Div2/ Round_2_Div2

/끝에 있는 소스 디렉터리 이름은 의도적인 것 입니다. 이렇게 하면 대상 디렉터리 아래에 소스 디렉터리의 파일 계층이 다시 생성되고 기존 데이터를 덮어쓰지 않습니다. 소스 디렉터리는 그대로 유지됩니다(그래서 이복사옵션을 추가하지 않는 한 이동하는 대신 --remove-source-files).

답변3

나는 사용할 것이다mv -S dup folder1/* folder2

mv다음과 같이 대화식으로 사용할 수 있습니다 .-i다른 답변제안. 아니면 당신은 사용할 수 있습니다-S --접미사=접미사. 이는 file.txt가 이미 존재하는 경우 새 위치의 파일 이름이 file.txtdup으로 변경됨을 의미합니다(-S dup 사용).

사용 awk:

디렉터리가 텍스트 파일에 나열되어 있기 때문입니다. 이 목적으로 다음 awk 명령을 사용할 수 있습니다.

awk '{ printf "mv -S dup %s/* ", $0 ; getline < "newname.txt"; printf "%s\n", $0 }' rename.txt

관련 정보