파일 복사 및 이름 바꾸기

파일 복사 및 이름 바꾸기

거대한 파일 트리가 있습니다. some_code.c및 와 같은 일부 파일은 이름은 같지만 대소문자가 다릅니다 Some_Code.c.

그래서 NTFS/FAT 파일 시스템에 복사하려고 하면 파일을 바꿀 것인지 아니면 건너뛸 것인지 묻는 메시지가 나타납니다.

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

답변1

많은 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 매뉴얼자세한 내용은.

답변2

나는 노력했다

apropos copy | grep "(1)" 

가능한 후보를 찾기 위해 mcopy가 등장했습니다.

man mcopy 

유망한 옵션을 보여주는 것이 멋지지 않을까요 -D clash-option? 하지만 그다지 멋지지는 않습니다. 설명이 없습니다. 그러나 mtools.dvi에는 몇 가지 프롬프트가 있습니다. Google을 통해 검색했지만 성공하지 못했습니다. 그러나 나중에 Google을 사용하여 직접 검색했습니다.mcopy clash-option .이 웹사이트를 찾았습니다.

간단한 테스트를 해봤습니다

mcopy -D A f* a 

autorename 및 targetdir 테스트 a- 자동으로 이름을 바꾸는 대신 모든 파일을 무시하거나 덮어쓰도록 요청했습니다. 멍청한....

내 버전은 mtools-4.0.101996년 버전입니다. 도움말 페이지는 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 ";"

참고: -maxlength, -name 및 -type은 영향을 받는 파일 수를 크게 제한하는 데 사용됩니다. 나는 스크립트의 더 깊은 파일 구조를 테스트하지 않았으며 줄 바꿈, 페이지 나누기 등과 같은 파일 이름의 공백 및 기타 펑키 문자를 테스트하지도 않았습니다.

.1은 대부분의 명령에서 문제를 일으키지 않기 때문에 사용하는 반면 a(및 a)는 일반적으로 마스크해야 합니다.

답변3

cp적어도 GNU에서는 그렇지 않습니다.

중복된 파일 이름을 사용하지 않는 것이 좋습니다(대소문자 무시). 이는 문제만 야기할 수 있습니다. 목록을 사용하여 그러한 중복 항목을 찾으세요.

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

그런 다음 각 줄에 대한 파일 중 하나의 이름을 수동으로 바꿉니다(출력된 경우). 앞으로는 중복 생성을 피하십시오.

관련 정보