거대한 파일 트리가 있습니다. 일부 파일의 이름은 동일하지만 경우가 다릅니다 (예 : some_code.c
및) Some_Code.c
.
따라서 NTFS / FAT 파일 시스템에 파일을 복사하려고 할 때 파일을 바꿀 것인지 건너 뛸 것인지 묻습니다.
예를 들어 (1)
(Windows 7처럼) 충돌 파일 이름 에 추가 하여 이러한 파일의 이름을 자동으로 바꾸는 방법이 있습니까?
거대한 파일 트리가 있습니다. 일부 파일의 이름은 동일하지만 경우가 다릅니다 (예 : some_code.c
및) Some_Code.c
.
따라서 NTFS / FAT 파일 시스템에 파일을 복사하려고 할 때 파일을 바꿀 것인지 건너 뛸 것인지 묻습니다.
예를 들어 (1)
(Windows 7처럼) 충돌 파일 이름 에 추가 하여 이러한 파일의 이름을 자동으로 바꾸는 방법이 있습니까?
답변:
많은 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 설명서 를 참조하십시오.
brew install coreutils
후 명령을 사용 gcp
하는 대신.
나는 시도했다
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)는 종종 마스킹이 필요합니다.
cp
적어도 GNU 에서는 아닙니다 .
중복 된 파일 이름 (대소 문자 무시)을 사용하지 말 것을 강력히 권장합니다. 다음을 사용하여 이러한 중복 목록을 찾으십시오.
find . | tr A-Z a-z | sort | uniq -d
그런 다음 출력 할 경우 각 줄의 파일 중 하나의 이름을 수동으로 바꿉니다. 나중에 중복을 만들지 않도록하십시오.
sudo fdisk -l /dev/sda
), 그리고 한touch foo; touch Foo
2 개 파일을 종료foo
하고Foo
. 그러나 Windows로 다시 부팅하여 저기 어떻게 보이는지 궁금하지 않습니다. 그냥 FAT 문제일까요? 아-FAT가있는 USB 스틱이 있고 파일 안에 FAT 시스템을 만들 수 있습니다 ... 잠시만 기다려주세요. :)