파일 이름 충돌을 피하면서 (파일 | 디렉터리) 이동

파일 이름 충돌을 피하면서 (파일 | 디렉터리) 이동

여러 다른 위치의 파일을 이름이 지정된 폴더로 이동하는 bash 스크립트가 있습니다 completed.

이전 파일을 덮어쓰는 것을 방지하고 싶기 때문에 Selection Of Recipes.zip이동하려는 파일 이름(예: )이 이미 에 있는 경우 completed파일 이름에 임의의 숫자나 다른 문자열을 추가하여 구별합니다( Selection of Recipes-???.zip, 여기서 ???임의의 문자열은 무엇입니까).

그냥 사용하는 것이 가능합니까 mv, 아니면 해당 측면을 처리하는 매개변수를 사용하여 다른 bash 스크립트를 작성해야 합니까? 내가 직접 디자인하는 데 사용할 수 있는 bash 스크립트를 갖고 있는 사람이 있나요?

답변1

GNU를 사용하는 경우 mv다음과 같은 옵션이 있습니다.

$ mv -b source/* dest/.

이 스위치는 디렉터리에서 충돌하는 mv모든 파일을 백업 버전으로 푸시하도록 지시합니다. 일반적으로 파일을 디렉터리로 이동하기 전에 파일 끝에 물결표( )를 추가합니다.dest/.~

파일이 포함된 다음 샘플 디렉터리가 있다고 가정해 보겠습니다.

$ mkdir source dest
$ touch source/file{1..3} dest/file{1..5}

$ tree
.
├── dest
│   ├── file1
│   ├── file2
│   ├── file3
│   ├── file4
│   └── file5
└── source
    ├── file1
    ├── file2
    └── file3

source이제 파일을 에서 다음 으로 이동할 때 dest:

$ mv -b source/* dest/.
$ tree 
.
├── dest
│   ├── file1
│   ├── file1~
│   ├── file2
│   ├── file2~
│   ├── file3
│   ├── file3~
│   ├── file4
│   └── file5
└── source

2 directories, 8 files

제어 확장

마찬가지로 GNU 버전의 경우 mv스위치를 사용하여 기본 동작을 변경할 수 있습니다 -S <string>.

$ mv -b -S "string" source/* dest/.

$ mv -b -S .old source/* dest/.

$ tree 
.
├── dest
│   ├── file1
│   ├── file1.old
│   ├── file2
│   ├── file2.old
│   ├── file3
│   ├── file3.old
│   ├── file4
│   └── file5
└── source

2 directories, 8 files

답변2

여기에 스크립트가 있습니다. 호출하는 경우 move명령을 사용해야 합니다.move file destination

#!/bin/bash

FILE=$1
DEST=$2

if `ls ${DEST}/${FILE} > /dev/null`
then
    base=`echo ${FILE} | sed 's/\(.*\)\..*/\1/'`
    ext=`echo ${FILE} | sed 's/.*\.\(.*\)/\1'`
    r=$RANDOM
    mv ${FILE} ${DEST}/${base}-${r}.${ext}
else
    mv ${FILE} ${DEST}
fi

사용자가 두 매개변수를 모두 제공했다는 사실뿐 아니라 일부 유효성 검사(무작위로 번호가 지정된 파일이 이미 존재하지 않는지 확인하는 등)를 추가해야 할 수도 있습니다.

관련 정보