mv: 대상이 존재하지 않는 경우에만 파일 이동

mv: 대상이 존재하지 않는 경우에만 파일 이동

존재하지 않을 때만 이동하는 방식으로 사용할 수 있나요 mv file1 file2?file1file2file2

나는 노력했다

yes n | mv -i file1 file2

(이렇게 하면 mvfile2를 덮어써야 하는지 묻고 자동으로 "아니요"라고 대답합니다.) 그러나 남용 외에도 -i좋은 오류 코드도 제공하지 않습니다(이동하면 항상 0 대신 141, 이동하지 않으면 0이 아님). 그러면 다른 값입니다)

답변1

mv -vn file1 file2. 이 명령은 원하는 대로 작동합니다. -v원한다면 건너뛸 수 있습니다.

-v장황하게 만드십시오 - mv는 파일을 이동했는지 알려줄 것입니다(파일이 이동되지 않을 가능성이 있기 때문에 유용합니다)

-nfile2가 존재하지 않는 경우에만 이동합니다.

하지만 참고하세요.이것은 POSIX가 아닙니다~처럼토마스 디키가 언급한.

답변2

mv -n

man mvGNU 시스템 에서 :

-n, --no-clobber
기존 파일을 덮어쓰지 않습니다.

FreeBSD 시스템의 경우:

-n기존 파일을 덮어쓰지 마십시오. (-n 옵션은 이전 -f 또는 -i 옵션보다 우선합니다.)

답변3

if [ ! -e file2 ] && [ ! -L file2 ]
then
    mv file1 file2
# else echo >&2 there is already a file2 file.
fi

또는:

if ! ls -d file2 > /dev/null 2>&1
then
    mv file1 file2
fi

mvfile2존재하지 않는 경우 에만 실행하십시오. a가 테스트와 사이에 생성되었을 수 있으므로 a가 file2덮어쓰여지지 않을 것이라는 보장은 없습니다 . 그러나 적어도 최신 버전의 GNU는 해당 보장을 제공 하지 않습니다 (비록 검사가 이루어지기 때문에 경쟁 조건이 더 좁기는 하지만). ) 이내에 완료되었습니다.file2mvmv-i-nmv

반면에 이식성이 뛰어나므로 파일 유형 file2(일반, 파이프 또는 심지어 파일 형식) 에 관계없이 다양한 경우를 구별할 수 있습니다.목차).

답변4

test -e name이름이 존재하는 경우(파일, 디렉터리 또는 심볼릭 링크에 관계없이) true를 반환하는 which를 사용할 수도 있습니다.

예를 들어:

touch file
mkdir dir
ln -s file symlink
test -e file && echo file exists
test -e dir && echo dir exists
test -e symlink && echo symlink exists
test -e file || echo you wont see this echo
test -e doesnotexist || echo doesnotexist does not exist...

관련 정보