이름을 바꾸어 파일 복사


28

거대한 파일 트리가 있습니다. 일부 파일의 이름은 동일하지만 경우가 다릅니다 (예 : some_code.c및) Some_Code.c.

따라서 NTFS / FAT 파일 시스템에 파일을 복사하려고 할 때 파일을 바꿀 것인지 건너 뛸 것인지 묻습니다.

예를 들어  (1)(Windows 7처럼) 충돌 파일 이름 에 추가 하여 이러한 파일의 이름을 자동으로 바꾸는 방법이 있습니까?


이상한. 난 그냥보고 싶어, 어떤 종류의 오류가 나는이 NTFS 파티션에 같은 이름의 파일을 생성하려고하면 (HPFS / NTFS에 따라 얻을 sudo fdisk -l /dev/sda), 그리고 한 touch foo; touch Foo2 개 파일을 종료 foo하고 Foo. 그러나 Windows로 다시 부팅하여 저기 어떻게 보이는지 궁금하지 않습니다. 그냥 FAT 문제일까요? 아-FAT가있는 USB 스틱이 있고 파일 안에 FAT 시스템을 만들 수 있습니다 ... 잠시만 기다려주세요. :)
— 사용자가 알 수 없음

답변:


41

많은 GNU의 같은 도구 cp, mv그리고 tar타겟이 존재하는 경우 백업 파일을 생성을 지원합니다. 즉 복사 할 때, foo에 bar이미라는 파일이있는 경우, bar는 기존은 bar 이름이 변경되며, 복사 이후 bar의 내용을 포함합니다 foo. 기본적 bar으로 이름은으로 바뀌지 bar~만 동작을 수정할 수 있습니다.

                                # If a file foo exists in the target, then…
cp -r --backup source target    #   rename foo → foo~
cp -r --backup=t source target  #   rename foo → foo.~1~ (or foo.~2~, etc)

번호가 지정된 백업이 이미 존재하는 경우에만 백업과 같은 다른 변형이 있습니다. 자세한 내용은 coreutils 설명서 를 참조하십시오.


1
훌륭한. 나는이 옵션이 존재한다는 것을 몰랐으며 매우 유용하다는 것을 알았습니다. 감사합니다 @Gilles.
— Steve Hill

2
OSX cp에는 --backup 플래그가 없습니다. 사용 brew install coreutils후 명령을 사용 gcp하는 대신.
— Weston Ganger

6

나는 시도했다

apropos copy | grep "(1)" 

가능한 후보를 찾고 mcopy가 나타났습니다.

man mcopy 

유망한 옵션 -D clash-option이 멋지지 않습니까? 그러나 그렇게 시원하지는 않습니다-설명되지 않았습니다. 하지만 성공하지 않고, 내 시스템에 검색 mtools.dvi에 대한 몇 가지 힌트가있다, 그리고 구글을 통해 성공을하지 않고 있지만, 다음, 구글과 함께, 내가 직접 검색 mcopy clash-option하고 이 사이트를 발견 .

나는 짧은 테스트를했다

mcopy -D A f* a 

autorename과 targetdir을 테스트하기 위해 a-자동 이름 바꾸기 대신 모든 파일을 무시하거나 무시하도록 요청했습니다.

내 버전은 mtools-4.0.10도움말 페이지는 1996-15 세입니다. 그 동안 우리는 실제로 일부 기능을 잃어야합니까?

작업을 두 단계로 나누었습니다.

  • 해당 이름을 사용하는 경우 파일의 고유 이름을 생성하는 짧은 기능을 만드십시오.
  • 를 실행 find하고 복사하려는 모든 파일에 대해 해당 스크립트를 실행 하십시오 .

이 접근법을 도와 줄까요? :)

다음은 파일을 자동으로 바꾸는 스크립트입니다.

#!/bin/bash

name=$1
target=$2

autorename () {
name=$1
target=$2
no=$3 

test -e ${target}/${name}.$no && autorename ${name} ${target} $((no+1)) || cp ${name} ${target}/${name}.$no 

}

test -e ${target}/${name} && autorename ${name} ${target} 0 || cp ${name} ${target} 

그리고 이것은 내 테스트 호출입니다.

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"

참고 : 영향을받는 파일 수를 극적으로 제한하는 데 사용되는 -maxdepth, -name 및 -type 더 깊은 파일 구조 나 줄 바꿈, 페이지 피드 등과 같은 다른 펑키 문자의 공백이나 파일 구조에 대해 스크립트를 테스트하지 않았습니다.

나는 대부분의 명령에서 문제를 일으키지 않기 때문에 .1을 사용했지만 (및 a)는 종종 마스킹이 필요합니다.



0

cp적어도 GNU 에서는 아닙니다 .

중복 된 파일 이름 (대소 문자 무시)을 사용하지 말 것을 강력히 권장합니다. 다음을 사용하여 이러한 중복 목록을 찾으십시오.

find . | tr A-Z a-z | sort | uniq -d

그런 다음 출력 할 경우 각 줄의 파일 중 하나의 이름을 수동으로 바꿉니다. 나중에 중복을 만들지 않도록하십시오.


그 남자는 그가 그 엉망을 만든 사람임을 암시하지 않았습니다.
— tshepang

글쎄요, 맞습니다.하지만 그는 결과를 겪고있는 사람입니다
— jmtd

약간 다른 시간의 백업으로 끝나는 상황이 있습니다. 그것들을 결합하고 싶지만 다른 버전을 방해하지 마십시오. 예를 들어, 내가 아는 모든 것보다 오래된 것이 더 나을 수 있습니다. 내가 조사한 후에 만 ​​말할 수 있습니다. 그 동안 백업을 복사하고 이름을 바꿔야합니다.
— abalter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.