아무것도 덮어쓰지 않고 명시적으로 파일을 이동하는 방법

아무것도 덮어쓰지 않고 명시적으로 파일을 이동하는 방법

아무것도 덮어쓰지 않고 파일을 이동할 수 있는 명령이나 옵션이 있습니까?

논의를 위해 이 파일의 이름을 foo.rar로 지정하겠습니다.

이제 -n이 작동하며 파일을 덮어쓰지 않습니다. 하지만 파일이 있으면 이동하지 않습니다. 시스템 오류(예: 디스크 공간 부족)를 제외하고 파일을 이동하고 싶습니다.

-b도 작동합니다. -b의 문제점은 백업 파일이 있는 경우 -b가 새 백업 파일로 백업 파일을 삭제한다는 것입니다.

이제 이 질문에 몇 가지 맥락을 추가하기 위해 foo.rar의 예를 살펴보겠습니다. /home에서 foo.rar를 검색해 보겠습니다. 이 이름을 가진 10개의 다른 파일을 찾았습니다. 내가하고 싶은 것은 다음 세 가지 명령을 실행하는 것입니다.

mkdir /tmp/foo_files
find /home -iname "foo.rar" -exec wanted_mv_command {} /tmp/foo_files \;
mv /tmp/foo_files ~/

~/foo_files에 foo.rar, foo.rar.1, foo.rar.2 ... foo.rar.9가 포함되기를 원합니다.

어떤 모드를 사용하든 상관없습니다. 예를 들어, foo.rar 대신 foo.#.rar을 사용할 수 있습니다.# > 저는 단지 두 가지를 원합니다. 파일의 원래 이름이 무엇인지 나타내고 파일의 다른 버전이 표시됩니다.

답변1

GNU mv를 사용하고 있으므로할 수 있는해당 --backup옵션을 사용하십시오. 번호가 매겨진 백업을 켜십시오.

 mv --backup=numbered file1 file2 your_dir

-S옵션을 통해 접미사를 변경할 수 있습니다 .

예는 다음과 같습니다.

$ mv --backup=numbered aa/foo bb/foo cc/foo .
$ ls
aa  bb  cc  foo  foo.~1~  foo.~2~

답변2

방금 작은 스크립트를 만들었으니 이름을 로 지정하겠습니다 mv_safe.sh. 용법:mv_safe SOURCE_FILE TARGET_DIRECTORY

if test ! -e "$2/$1"
then
  mv -- "$1" "$2"
else
  tries=1
  while test -e "$2/$1.$tries"
  do
    tries=$((tries+1))
  done
  mv -T -- "$1" "$2/$1.$tries"
fi

경고: 이것은 원자적이지 않습니다. 이 스크립트의 여러 복사본을 병렬로 실행하고 동일한 파일을 대상으로 하는 경우 서로의 파일을 덮어쓸 수 있습니다.

feefoo/foo.bar예: /tmp에 and 가 있습니다 .foo.bar

$ ./mv_safe.sh foo.bar feefoo

따라서 여기서는 " "라는 이름이 이미 사용된 곳 foo.bar으로 "안전하게" 이동하려고 합니다 . 그것이 무엇을 제공하는지 봅시다:feefoofoo.bar

$ ls feefoo
foo.bar   foo.bar.1

아직 사용되지 않은 일반적인 mvif 이름이 있습니까 ?$1$2

관련 정보