mv -f의 요점은 무엇입니까?


34

에 대한 GNU로 coreutils 매뉴얼은mv 말합니다 :

-f --force Do not prompt the user before removing a destination file.

그러나 이것은 이미 기본 동작 인 것처럼 보이 mv므로 -f옵션이 불필요한 것으로 보입니다. 예 : GNU Bash 버전 4.3.11 :

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

-f플래그를 의도하지 않은 것 같습니다. 이 명령을보다 간결하고 일관성있게 수행 하는 별칭을 재정의하는 몇 가지 표준 방법 (예 :을 사용 )이 alias mv="mv -i"있기 때문 입니다.\mv

매뉴얼은 "-i, -f, -n 옵션 중 둘 이상을 지정하면 마지막 옵션 만 적용된다"고 지적하지만 여전히 -f플래그 의 의도는 -i일반적으로 플래그 를 무시하는 것 같지 않습니다. 을 사용 mv하는 것보다 훨씬 간결하고 이해하기 쉬운을 사용하여 동등한 동작을 수행 할 수 있기 때문 mv -if입니다.

이 경우 -f플래그 의 목적은 무엇 입니까? 왜 존재합니까?


6
기본값은 까다로운 사업입니다. 예를 들어 mount, 더 나은 도구가 있지만 과 같은 도구를 사용하십시오 . 모든 옵션의 기본값이 무엇인지 기억해야하므로 설정해야 할 옵션을 결정할 수 있습니까? 기본값과 기본값이 아닌 옵션을 모두 사용하는 것이 좋으므로 기본값을 정신적으로 추적하지 않고 옵션을 명시 적으로 설정할 수 있습니다. 뭔가 뭔가보다 기억하기 쉽다 거기 .
와일드 카드

MV는 alised 경우 동등한 동작 MV-I를 위하여 사용될 수 없다
PlasmaHH

1
IMO는 명시 적이기 때문에 스크립트에서 사용하기에도 좋습니다. 의도를 조금 더 잘 전달합니다.
Blacklight Shining

답변:


41

사용법은 4BSD -fman 페이지 에서 더 명확하게 설명되어 있으며 여기에 -f-i옵션이 추가되었습니다.

경우 파일 2가 이미 존재하기 전에이를 제거 파일 1이 이동됩니다. file2에 쓰기를 금지하는 모드가 있으면 mv는 모드를 인쇄하고 표준 입력을 읽어 행을 얻습니다. 선이 y로 시작하면 이동이 발생합니다. 그렇지 않으면 mv가 종료됩니다.

옵션 :

-i대화식 모드를 나타냅니다. 이동이 기존 파일을 대체 할 때마다 파일 이름 뒤에 물음표가 표시됩니다. 'y'로 시작하는 줄로 대답하면 이동이 계속됩니다. 다른 응답은 이동이 발생하지 못하게합니다.

-f힘을 나타냅니다. 이 옵션은 모든 모드 제한 또는 -i스위치 보다 우선합니다 .

mv의 작동 방식에 대한보다 정확한 정의는 POSIX 표준 에 나와 있으며, 이는 명령 행에서 나중에 발생하는 경우 -f에만 대체 -i됩니다.

따라서 기본 동작은와 약간 다릅니다 -f. 기본값은 대상이 쓰기 가능하지 않은 경우에만 확인을 요청하는 것입니다. (이 동작은 멀리 돌아 적어도 간다 V4 , mv어떤 옵션을하지 않았다.)이 경우 -i옵션이 주어 대상이 존재 할 때마다, MV가 추가로 확인을 요청합니다. 이 -f옵션을 사용하면 두 경우 모두 요청하지 않습니다 (이후에 발생하는 경우 -i).


좋은 답변, 감사합니다! NB 일부 파일 시스템 (예 : CIFS)은 mv -f가 사용 되지 않은 경우에도 플래그가 사용 된 것처럼 작동하는 등 예기치 않은 동작 (예 : 매뉴얼과 다른)을 유발할 수 있습니다 .
sampablokuper

많은 구현이 대화 형 터미널 ( isatty(0)) 에있는 것으로 확인 된 경우에만 확인을 요청한다는 점은 주목할 가치가 있습니다 . 또한 나중에 -f재정의 하는 것이 사실이지만 -i이것이 인수가 주어지지 않은 것과 동일하다는 의미는 아닙니다.
phk

15

실행을 mv정상 기본값으로 설정할 때 유용합니다 .

alias mv="mv -i"

그런 다음 강제로 이동하려고하면 다음과 같이 작동합니다.

mv -f

확장 명령의 마지막 옵션이므로 다음을 계산합니다.

mv -i -f

이 점은 GNU Coreutils 매뉴얼 에도 언급되어 있습니다 .


1
고맙지 만 지금 질문에 추가 alias mv="mv -i"한 이유로 재정의 가의 존재 이유가 아닌 것 같습니다 -f.
sampablokuper

12
나는 당신이 mv(1)암시하는 것처럼 " 당신이 요구 한대로 멍청한 질문은 없다" (그리고 다른 유닉스 명령어) "미친" 행동을
부르는 것에 반대

1
vonbrand는.없이 Linux / UNIX 명령에 대한 직접적인 응답에 감사 -i하지만 몇 년 이상 명령 행을 사용한 사람은 mv어느 시점에서 타 버렸다고 생각합니다 .
Alexander

1
-i를 재정의하는 것은 거의 불가능하다고 생각할 수도 있지만, 이것이 바로 -f가 그렇게 사용 된 것으로 추측하는 이유입니다.
Walter

11

( man mv) 때문에 존재합니다

당신이 중 하나 이상을 지정하면 -i, -f, -n, 오직 마지막 하나가 적용됩니다.

따라서 항상 묻는 스크립트 / 별칭 / 함수를 사용할 수 있지만 여전히 옵션을 무시할 수 있습니다.

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

의미있는 기능 / 스크립트는 물론 더 많은 작업을 수행합니다 (예 : 작업 기록).


@choroba 고맙지 만, 지금 질문에 추가 한 이유로 같은 별칭을 재정의 alias mv="mv -i"하는 것이 존재 하지 않는 것 같습니다 -f. 그러나 스크립트와 함수도 언급합니다. 이 두 가지를 사용하여 예를 들어 주시겠습니까?
sampablokuper

@sampablokuper : 업데이트되었습니다.
choroba

@choroba, 다시 한번 감사합니다. 안타깝게도 함수 예제 나 스크립트 예제에서 모두를 사용하지 않으므로 해당 함수 mv -f의 존재를 정당화 / 설명하는 방법이 여전히 명확하지 않습니다. 내가 명백한 것을 놓친다면 죄송합니다!
sampablokuper

@sampablokuper : 모두 사용 mv -i합니다. 당신이 그것들을 사용하고 싶지만 상호 작용을 건너 뛰고 싶다면, 당신은 MV -f등을 사용할 것입니다 .
choroba

1
의 동작 @sampablokuper mv그 옵션 중 하나없이하는 것입니다 때로는 요청 이 사이에 명확한 차이가 될 수 있도록, (목표되지 쓰기 및 대화 형 단자) mv -f\mv.
phk

5

mv명령 -f은 프롬프트없이 쓰기 방지 된 파일을 덮어 쓰려고한다는 점에서 옵션 과 다르게 작동 할 수 있습니다 .

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

user2 디렉토리의 쓰기 권한으로 인해 user1 파일을에서 겹쳐 쓸 수 ./dir/있지만 그렇게하기 전에 경고가 표시됩니다. -f경고를 방지합니다.


-1

쉘 프로그래밍에서 -f를 사용하면 명령이 오류로 중단되지 않도록하거나 특정 명령을 실행할 때 스크립트 / 사용자에게 대화식 응답을 요청하는 데 사용되는 일반적인 관용구입니다. 마지막으로 원하는 것은 스크립트가 사용자 입력을 기다리거나, 잘못된 명령이 입력을 표준 입력에서 가져 오기를 기다리는 것입니다.

참고 : 별칭을 취소하면 부작용이 발생하거나 제거 될 수 있습니다. 명령을 다른 버전으로 또는 추가 옵션으로 별명을 지정한 경우 별명을 실행 취소하면 원하지 않는 부작용이 발생합니다. 예를 들어, 재활용 캔 (또는 기타 보호 / 추적 시스템)을 사용하기 위해 mv 및 rm을 사용하여 별칭을 설정했을 수 있습니다. 별칭을 취소하면이 문제가 해결됩니다.


Nitpick : -fcp 또는 mv 옵션은 "작동"을 보장하지 않습니다. 예를 들어, 권한이 충분하지 않으면 -f 명령이 작동하지 않습니다. 의미하는 것은 프롬프트없이 -f를 강제로 덮어 씁니다. 반대 플래그 -i는 덮어 쓰기시 대화식이 필요함을 의미합니다.
Eric Leschinski

주목해야 할 두 가지 : 1.) 구현은 일반적으로 대화식 터미널 ( isatty(0)) 에 있는지 여부를 테스트 하므로 스크립트가 파이프의 일부로 실행되는 경우 트리거되지 않습니다. 2) 추가는 -f실행 취소와 동일하지 않습니다 -i때문에 mv -i -f다릅니다은 mv, 볼 마크의 답변을 .
phk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.