나는 이와 같은 디렉토리 구조를 가지고 있습니다.
.
├── 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
라고도 함 ) 사용:prename
file-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