"mv"가 파일 그룹을 단일 일반 파일로 이동하는 것을 방지하는 방법은 무엇입니까?

"mv"가 파일 그룹을 단일 일반 파일로 이동하는 것을 방지하는 방법은 무엇입니까?

제가 저지른 어리석은 실수로 인해 오디오 컬렉션의 일부가 손실되었습니다. :-(
최근 백업이 있어서 다행이지만 여전히 짜증스럽습니다. 실제 백업 외에 또 다른 장난의 원인은 mv다음과 같이 표시된다는 것입니다.

오디오 파일에는 특정 구성표가 있습니다.

ARTIST - Some Title YY.mp3

YY두 자리 연도 사양은 어디에 있습니까?

mkdir 90<invisible control character>

(지금까지는 눈에 보이지 않는 추가 문자의 1/3을 실제로 입력하고 있다는 사실을 전혀 몰랐습니다...!)
모든 것을 하나의 디렉토리에 넣는 대신 90년대 음악을 모두 하나의 디렉토리에 넣기를 원했습니다. 그래서 나는 다음을 입력합니다:

find . -name '* 9?.mp3' -exec mv {} 90 \;

무슨 일이 일어나고 있는지 이해하는 것은 어렵지 않죠? :->
(비극적인) 결과는 처녀였습니다.비어 있는"90"이라는 디렉토리무엇' (그리고무엇"보이지 않는" 제어 문자입니다) 및파일"90"이라고 불리는N이류.

모든 파일이 사라졌습니다. :-(( (확실히)

mv그러길 바라확인됨시간 내에 대상 "파일"이 서명되었는지 여부(*NIX에서 기억:모든 것이 파일이다d------)는 (예 : ) 로 시작합니다 drwxr-xr-x. 물론 목적지에 관계없이존재하다별말씀을요. 단순히 다음과 같은 경우 위 시나리오에 변형이 있습니다.잊다먼저 mkdir디렉토리로 이동하십시오. (물론 거기에 있다고 가정하겠지만...)

우리가 싫어하는 운영체제도 대문자로 시작해요와트그렇습니다. 당신은 균등화 할 수 있습니다힌트필요한 경우 대상 유형(파일? 디렉터리?)을 지정합니다.

mv그래서 우리 *NIX 사용자가 이러한 최소한의 놀라움을 피하기 위해 여전히 "스크립틀릿"을 작성해야 하는지 궁금합니다 .

답변1

/파일을 디렉터리로 이동하려면 대상 위치에 를 추가하면 됩니다. 디렉터리가 존재하지 않으면 다음 오류가 발생합니다.

mv somefile somedir/
mv: cannot move ‘somefile’ to ‘somedir/’: Not a directory

디렉터리가 있으면 파일을 해당 디렉터리로 이동합니다.

답변2

GNU coreutils mv에는 이동하려는 디렉토리를 지정하는 옵션( -t/ ) 이 이미 있습니다 --target-directory. 이 옵션에 대한 인수가 존재하지 않으면 mv모든 파일을 동일한 파일 이름으로 이동하는 대신 오류가 발생합니다.

나는 당신의 포터에게 다음과 같이 쓸 것입니다 :

find . -name '* 9?.mp3' -exec mv -t 90 {} +

+대체를 사용하면 \;실행 속도를 높이기 위해 가능한 한 많은 파일 이름을 결합합니다.

답변3

또한 일반적으로 향후 우발적인 보장을 방지할 계획이라면 개인적으로 -i다음과 같은 옵션이 있을 수 있습니다.mv

alias mv='mv -i'

무언가를 재정의해야 하는 경우 해당 -f옵션을 전달하면 됩니다.

별칭은 대화형 셸에 직접 명령을 입력하는 경우에만 적용되지만 via의 경우에는 find.

find . -name '* 9?.mp3' -exec mv -i {} 90 \;

mv그러면 기존 파일을 덮어쓸 것인지 묻는 메시지가 표시됩니다 .

답변4

대체 일반 전략으로 이 작업을 임시 스크립트로 전환하는 것이 좋습니다. 나는 결과를 보고 수동으로 명령 find으로 변환하여 mv실행하기 전에 수행 중인 작업을 확실히 이해하는 것을 선호합니다. 예를 들어.

find . -name '* 9?.mp3' > tmp
vim tmp

이제 파일 이름 목록을 보고 파일 내용을 셸 명령으로 다시 쓸 수 있습니다.

  • 파일 내용을 한 줄에 입력하세요.ggVGJ
  • 접두사:Imv [esc]
  • 추가의:Asomedir/ [esc]
  • 문서를 저장합니다. 다시 읽어보세요. 숨을 쉬십시오.
  • source tmp명령줄에서 실행됩니다.

이는 보수적인 전략이지만 명령을 잘못 입력 -exec하거나 sed셸 확장을 오해하는 경우가 종종 있으므로 느리고 일관된 접근 방식을 선호합니다.

즉, 나는 그것을 사용하기에는 너무 소심합니다 -exec.

관련 정보