파일이 있으면 새 이름을 사용하여 다른 폴더에 복사합니다.

파일이 있으면 새 이름을 사용하여 다른 폴더에 복사합니다.

여러 위치와 드라이브에 거의 동일한 파일과 이름을 가진 폴더가 있습니다. 모두 한 곳으로 옮기고 싶습니다. 구조는 다음과 같습니다.

Folder 1
--> Folder 1.1
-----> File1.txt
-----> File2.txt
Folder 2
--> Folder 2.1
-----> File1.txt
-----> File2.txt
...
-----> FileN.txt

다른 드라이브의 다른 위치로 모두 옮기고 싶습니다. 복사나 이동시 이동되는 파일의 이름을 FileN-copy-1.txt 등으로 바꾸고 싶습니다. 이는 Mac의 Finder에서 파일을 이동할 때의 동작과 유사하며, 선택한 경우 파일 이름을 "keep two"로 점진적으로 지정합니다.

rsync를 사용해 보았지만 이동 중인 새 파일의 이름을 바꾸는 옵션이 없는 것 같습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

다음과 같이 간단한 bash 스크립트를 만들 수 있습니다

#!/bin/bash

MyFolder=/my/folder
DestFold=/destinatin/folder
CpNum=10
i=0

for FlN in $MyFolder; do
  FlNo = echo $FlN |awk -F\/ '{print $NF}'
  if [! -f $DestFold/$FlNo ]; then
    cp $FlN $DestFold/
  else
    FlNo = echo $FlN |awk -F\/ '{print $NF}' 
    while [ $i -lt $CpNum ]; do
      i=$[$i+1]
      if [ ! -f $DestFold/${FlNo%.txt}-copy-$i.txt ]; then
        cp $FlN $DestFold/${FlNo%.txt}-copy-$i.txt
        i=$CpNum
      fi
    done
  fi
done

따라서 검색 및 대상 폴더를 입력한 다음 스크립트를 실행합니다(실행 가능하게 만들기 전에).

chmod 755 yourscript

스크립트는 파일을 찾아 변수에 넣고(FlN) 변수를 앞에 폴더 없이 파일 이름으로 잘라내거나(FlNo) 그러한 파일이 없으면 복사본을 만듭니다. 존재하는 경우 추가된 파일을 생성합니다.-복사-X 파일 이름 끝 직전(X는 복사본 수)입니다. 변수는 $CpNum파일당 최대 복사본 수입니다(안전하게 늘릴 수 있음). 현재는 .txt 파일에 적용되지만 수정할 수 있습니다. 매개변수를 사용하여 스크립트를 호출하는 옵션을 추가하거나 이를 다양한 확장으로 만들 수 있습니다.

답변2

rsync디렉터리 아래의 모든 파일과 하위 디렉터리를 복사하려는 경우 이는 좋은 첫 번째 선택입니다. 옵션이 있긴 한데아니요파일 덮어쓰기, -b백업 옵션.

그러나 기본적으로 백업에서는 이에 유용하지 않은 명명 체계를 사용합니다( ~일부 도구에서는 원치 않는 백업 파일로 숨기는 문자가 파일 이름 끝에 추가됨).

변경할 수 있는 옵션( --suffix newending)이 있으며 무엇이든 가능하지만 여전히 끝에 추가되며 이전 확장자를 제거하지 않습니다. 이것이 당신에게 효과가 있다면 이것은 당신에게 쉬운 일입니다 rsync. 이것은 적절한 백업이라는 점에 유의하십시오. 이름이 동일하고 그 외에는 동일한 파일 사본이 두 개 있을 수 없습니다.

예를 들어, 귀하의 경우 두 소스에서 대상을 채우려면 두 명령이 필요합니다.

rsync -av "Folder 1/" "New Folder/"
rsync -av -b --suffix -copy.txt "Folder 2/" "New Folder/"

공백이 있는 파일에 필요한 특수 따옴표와 디렉터리 내용을 나타내는 후행 /(디렉토리 아래에서 시작, 제외)에 유의하세요.

-copy.txt폴더 1에 이미 존재하는 파일은 다음 위치 에 추가됩니다 .

; ls -R1 New\ Folder
'New Folder':
f1.txt
f1.txt-copy.txt
f2.txt
f2.txt-copy.txt

고쳐 쓰다:

이 두 명령은 기본적으로 첫 번째 디렉터리에서 두 번째 디렉터리로 동기화되며, 추가 명령은 대상에 존재하는 모든 항목을 덮어쓰며, 백업 옵션은 손상될 수 있는 파일이 백업으로 유지되도록 이를 변경합니다. 따라서 사실상 두 번째 줄의 파일 이름은 그대로 유지됩니다. 명령이 다른 순서로 실행되는 경우에도 원래 목적에 여전히 유용할 수 있습니다.

즉, 백업 및 접미사 옵션과 함께 rsync를 사용하는 경우 대상은 azad.txt파일을 대체하지만 백업 옵션은 대상의 이전 파일을 유지하고 새 접미사로 이름을 바꿉니다.

답변3

나는 복잡성 측면에서 두 가지 답변에 모두 동의하려고 노력할 것입니다. 귀하의 요구 사항을 충족하는 라이너는 다음과 같습니다.

srcdir=<Source Directory>;dstdir=<Destination Directory>;cd $srcdir;for srcfile in *;do if [ -f $dstdir$srcfile ] then $srcfile $dstdir${srcfile%.*}-copy.${srcfile##*.}; else cp $srcfile $dstdir$srcfile; fi; done

가독성을 높이기 위해 다음과 같이 표시합니다.

srcdir=<Source Directory>
dstdir=<Destination Directory>

cd $srcdir

for srcfile in *
do
    if [ -f $dstdir$srcfile ]
        then 
            cp $srcfile $dstdir${srcfile%.*}-copy.${srcfile##*.}
        else
            cp $srcfile $dstdir$srcfile
    fi
done

이것이 어떻게 작동하는지 설명하려면 소스 및 대상 디렉터리를 입력해야 합니다. $srcfile이 전체 경로 형식이 아니고 변수가 사용될 때마다 문자열 확장이 필요하지 않도록 디렉토리에 cd합니다. 이제 $srcdir의 각 파일을 살펴보고 파일이 $dstdir에 존재하는지 확인하고, 그렇다면 -copy를 삽입한 다음 파일을 $dstdir$srcfile에 cp합니다. 파일 이름과 확장자 사이(${srcfile%.} 파일 이름과 ${srcfile##만 인쇄합니다..} 확장자만 인쇄합니다). 존재하지 않는 경우 평소대로 복사됩니다.

여기서 다중 복사 사례를 다루지 않는 이유를 설명하자면, 시나리오에서는 일회성 복사본에서 여러 디렉터리를 다른 디렉터리로 지정하지 않으므로 이 시나리오가 존재할 수 없습니다. 즉, -copy를 사용하여 파일을 덮어쓰거나 추가(src 및 dst 디렉터리에 따라)하므로 주의해야 합니다. 명명 규칙.

관련 정보