중복 이름이있을 때 파일을 이동하고 사용자에게 프롬프트합니다.
Subv3rsion 과 Eric Leschinski의 답변 에서 알 수 있듯이 -newermt
술어는 피연산자로 지정된 날짜 (및 선택적 시간)보다 최근에 수정 된 파일을 선택합니다. 파일을 찾으려면
- 어디서나
srcdir
(즉, 등 하위 디렉토리, 그 하위 디렉토리 포함)
- 예를 들어 2014 년 9 월에 마지막으로 수정 된 날짜
- 그것들 을
destdir
... 당신은 실행할 수 있습니다 :
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv -i {} destdir/ \;
에서 -exec
표현 발견은 자리에서 볼 수있는 파일 이름을 전달합니다 {}
. ;
는 -exec
실행될 명령과 해당 인수가 모두 제공 되었음을 나타냅니다 (특정 -exec
술어의 인수 를 찾기 위해 후속 표현식이 전달되는 경우 -아래 예 참조). 쉘에서 특별히 해석하지 않기 때문에 ;
이스케이프 처리해야합니다 \;
. (이 없다면 \
, ;
전체 끝낼 것입니다 find
줄 바꿈과 같은 작업, 명령을.이 비록 find
명령이이 후 아무것도없는 -exec
표현을 통과하지 못한 ;
인수가 여전히 구문 오류입니다.)
파일을 나열하고 싶을 경우 (이전 이메일 저장 방법 또는 다른 파일이 있는지 확실하지 않은 경우 권장) 생략 -exec
하고 오른쪽에있는 모든 것을 생략 하십시오. (이메일의 경우 종종 다른 날짜의 이메일이 동일한 파일에 저장 됩니다. 여기 질문에 설명 된 상황에있는 사람의 경우 파일을 이동하기 전에 파일이 저장되는 방법을 조사하는 것이 좋습니다.) 이름을 인쇄하고 이동하려면 그들 -print
앞에 추가하십시오 -exec
.
mv -i
대상에서 파일을 덮어 쓸 때마다 다음과 같은 메시지가 표시됩니다.
- 이전 백업에 동일한 이름의 파일이 있거나
- 이름이 같지만 다른 하위 디렉토리의 파일이
srcdir
동일한 find
작업 중에 이미 이동 했거나
- (최소한) 동일한 이름의 파일이 원본이 이동 한 후 다른 하위 디렉토리를 통과하면 곧 발견 될 수있을 정도로
srcdir
동일한 find
작업 중에 어딘가에 작성 되었습니다 find
.
호출하는 다른 방법 rm
:
중복 이름을 가진 파일을 처리하는 방법에 대한 다른 옵션이 있습니다.
- 없이
-i
(즉, ), 승인하지 일반적으로 프롬프트 것이지만, 대상 파일이 읽기 전용 있다면 그렇게 할 것입니다. ( 파일을 실행하는 사용자가 파일을 소유하는 경우와 같이 읽기 전용 파일을 덮어 쓰는 경우도 있습니다.)mv {} destdir/
mv
mv
- 그런 정도의 상호 작용을 원하지
mv
않고 항상 같은 이름의 파일을 덮어 쓰려고 시도하려면을 사용하십시오 mv -f
.
- 반대로 동일한 이름의 대상 파일이 이미있는 경우 소스 파일을 건너 뛰려면을 사용하십시오
mv -n
.
mv
-b
및 --backup
플래그를 수락하여 대상에 이미 존재하는 동일한 이름의 파일 이름을 자동으로 바꿉니다. 기본적으로 ~
백업 이름을 생성하기 위해 추가되며 이름이있는 파일과 백업 이름이있는 파일이 대상에 이미 존재하면 백업 파일을 덮어 씁니다. 이 기본값은를 호출 할 때 전달 된 옵션 mv
및 환경 변수에 의해 재정의 될 수 있습니다 . 자세한 man mv
내용과 아래 예를 참조하십시오.
이름이 중복되는 경우 파일 이동 및 백업 생성 :
모든 파일을 이동하려면 ~
접미사를 사용하여 이름이 중복 된 파일을 백업하고 파일이 이미 존재하는 경우 번호가 붙은 접미사를 사용 하여 덮어 씁니다..~n~
.~
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv --backup=existing {} destdir/ \;
이름이 중복 된 파일을 건너 뛰고 어떤 파일을 알고 싶은 경우 :
당신이 사용하는 경우 mv -n
와 같은 이름의 다른 파일이 때문에 이동하지 된 파일을 알고 싶어, 가장 좋은 방법은 원래의 실행 아마 find
하지 않고 명령을 다시 -exec
그것의 오른쪽에있는 모든 것을. 이름이 인쇄됩니다.
또한 원래 find .... -exec ...
명령 을 실행 한 이후 생성 된 일치하는 파일의 이름도 인쇄 하지만이 응용 프로그램의 경우 수정 시간이 오래된 파일을 찾기 때문에 일반적으로 아무것도 없습니다. 실제 나이보다 오래된 수정 타임 스탬프 touch
및 기타 메커니즘을 파일에 제공 할 수 있지만이 경우에는 사용자 모르게 발생하지 않는 것 같습니다.
중복 이름으로 인해 파일을 건너 뛰면서 즉시 알기 :
mv -n
파일 이동을 억제 할 때보고 하거나 특별한 종료 코드를 반환하지 않습니다 . 따라서 find
실행 중에 건너 뛴 파일에 대해 즉시 알리려면 별도의 단계를 수행해야합니다. 한 가지 방법은 다음과 같습니다.
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv -n {} destdir/ \; \
-exec [ -f {} ] \; -exec printf "\`%s' skipped (exists in \`%s')\\n" {} destdir \;
몇 가지 사소한 기술적 고려 사항 : mv
대상에 존재하는 것과 다른 이유로 파일을 복사하지 못하고 보고 성공을 종료 하면 잘못 경고 합니다 . 그럴 것 같지는 않지만 불가능하다고 확신하지는 않습니다. 또한 경쟁 조건을 겪을 수도 있습니다 . 이전 파일을 이동 한 후 매우 짧은 시간 동안 동일한 이름의 새 파일이 동일한 위치에 생성 된 경우 실제 오류가 전혀없는 경우 경고 메시지가 표시됩니다. 제거되었는지 확인하십시오. (응용 프로그램을 고려할 때 문제가 실제로 발생하지 않을 것입니다.) 대상을 확인하기 위해 다시 작성할 수 있습니다. 전에 하기이후 대신 파일 이동 : 경쟁 조건은 소스 파일 대신 새로 작성된 대상 파일과 관련됩니다. 오류 및 경고가보고있는 동안 그리고 find
나 mv
(또는 [
기록됩니다, 어떤이 안하지만) 표준 오차 , 우리의 ...skipped (exists in...
경고가 기록됩니다 표준 출력 . 일반적으로 둘 다 터미널에 표시되지만 스크립팅하는 경우 문제가 될 수 있습니다.
더 쉽게 읽을 수 있도록 해당 명령을 두 줄로 나누었습니다. 그런 식으로 실행하거나 \
및 줄 바꿈을 제거 할 수 있습니다 (즉, 줄 바꿈).
그 find
명령 은 어떻게 작동합니까?
find
술어는 테스트 (예 : -type
및 -newermt
), 리턴 값에 사용되거나 조치 (예 : -print
및 -exec
)이며 종종 부작용에 사용됩니다.
식 사이에 연산자 (예 : -a
for 및 , -o
for 또는 )가 제공 되지 않으면 -a
내포됩니다. find
채용 단락 평가를 위해 그리고 및 또는 . (즉, )는 p 및 q 표현식이 모두 true 인 경우에만 true이므로 p 가 false 인 경우 q를 평가할 필요가 없습니다 . 우리는 종종 이러한 용어로 생각하지 않지만, 후속 조치 또는 테스트를 평가하기 위해 테스트가 참이되어야하는 이유입니다. 예를 들어, 디렉토리에 있다고 가정하십시오 . false로 평가 되므로 나중에 모든 것을 건너 뛸 수 있습니다.p q
p -a q
find
-type f
테스트와 마찬가지로 작업도 true 또는 false로 평가됩니다. 이러한 방식으로, -exec
실행 된 명령이보고 성공 (true) 또는 실패 (false)를 종료했는지보고합니다. 이 -exec
표현 체인은 암시 적 및 다음 과 연결되어 있습니다 .
-exec mv -n {} destdir/ \; -exec [ -f {} ] \; -exec printf "\`%s' skipped (exists in \`%s')\\n" {} destdir \;
파일 이동을 시도하고 mv
실패 하면 보고가 중지됩니다. 다른 문제로 인해 파일이 이동되지 않은 경우 올바르게 건너 뛴 파일에 대해 경고하지 않습니다.
그러나 성공 하면 [
명령 을 실행 합니다 . 마찬가지로 find
, [
인수로 전달 표정의 자신의 종류를 지원합니다. [ -f {} ]
검사 후 피연산자 경우 -f
(하여 전달 find
대신은 {}
) 존재 (및 일반 파일), 반환하거나 참 / 성공 또는 false / 실패.
(많은 명령의 종료 상태는 성공 또는 실패를 나타내는 것으로 가장 잘 해석되지만, [
존재 상태는 일반적으로 true 또는 false로 가장 잘 해석됩니다.)
경우 [
false를 반환, 다음 파일은 이동 그래서, 그래서 아무것도 할 필요가 없습니다, 사라 졌어요. 그러나 [
false를 반환하면 파일이 여전히 존재합니다. 그런 find
다음 다음 -exec
표현식을 평가하여 경고 메시지를 인쇄합니다.
추가 자료