이름을 바꾸어 파일 복사


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타겟이 존재하는 경우 백업 파일을 생성을 지원합니다. 즉 복사 할 때, foobar이미라는 파일이있는 경우, 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.