아무것도 덮어쓰지 않고 파일을 이동할 수 있는 명령이나 옵션이 있습니까?
논의를 위해 이 파일의 이름을 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
으로 "안전하게" 이동하려고 합니다 . 그것이 무엇을 제공하는지 봅시다:feefoo
foo.bar
$ ls feefoo
foo.bar foo.bar.1
아직 사용되지 않은 일반적인 mv
if 이름이 있습니까 ?$1
$2