![한 디렉터리에서 다른 디렉터리로 최신 파일 이동](https://linux55.com/image/39732/%ED%95%9C%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%EC%84%9C%20%EB%8B%A4%EB%A5%B8%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EB%A1%9C%20%EC%B5%9C%EC%8B%A0%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%8F%99.png)
한 디렉터리에서 다른 디렉터리로 최신 파일을 이동하려고 합니다. 이 find
명령은 파일을 찾기는 하지만 다른 디렉터리로 이동하지는 않습니다. 대상 디렉터리가 존재합니다.
$ cd /app/path1/path2 && \
find . -type f -printf "%C@ %p\n" | sort | tail -n 2 | \
cut -d " " -f 2- |xargs -0 mv -t /app/path1/path2/path3
error: mv: cannot stat No such file or directory
답변1
귀하의 문제는 생성된 출력의 형식을 제어했기 때문에 발생합니다. find
이제 개행 문자로 분할됩니다 \n
. xargs
출력을 사용할 때 출력을 처리 하려면 -0
null 문자로 구분해야 합니다 \0
. 그러나 이를 해결하는 쉬운 방법은 다음과 같습니다.
$ find . -type f -printf "%C@ %p\n" | sort | tail -n 2 | \
cut -d " " -f 2- | tr '\n' '\0' | xargs -0 mv -t /app/path1/path2/path3
새 줄을 다시 null 값으로 변환하는 `tr '\n' '\0' 명령이 도입되었습니다.
답변2
xargs에 -0 옵션을 사용하지 않거나 -print0을 사용하십시오. xargs 매뉴얼 페이지의 일부
이러한 경우에는 이러한 문제를 방지하기 위해 -0 옵션을 사용하는 것이 좋습니다. 이 옵션을 사용하면보장할 필요가 있다xargs에 대한 입력을 생성하는 프로그램널 문자도 사용하십시오.구분 기호로. 예를 들어, 프로그램이 GNU find라면,-0을 인쇄하세요.옵션이 이 작업을 수행합니다.
답변3
파일 이름에 줄 바꿈이나 인쇄할 수 없는 문자가 포함되어 있지 않다고 확신하는 경우 구문 분석이 수행되는 드문 경우입니다 ls
.
cd /app/path1/path2
latest_file=$(LC_ALL=C ls -cr | head -n 1)
mv "$latest_file" /app/path1/path2/path3
또는 기본 셸 프로세스에서 디렉터리 변경을 방지하려면 다음을 수행하세요.
latest_file=$(LC_ALL=C ls /app/path1/path2 -cr | head -n 1)
mv "/app/path1/path2/$latest_file" /app/path1/path2/path3
LC_ALL=C
ls
비ASCII 문자가 많은(그러나 모든 시스템은 아님) 문자 그대로 인쇄되도록 하는 설정이 실행됩니다 . 제어 문자(인쇄할 수 없음)가 많은 시스템에서 여전히 깨져 있습니다.
여러 파일을 한 번에 이동할 수 있습니다. 대부분의 파일 이름을 계속 처리하려면 와일드카드를 끄고 줄 IFS
바꿈에서만 분할하도록 설정하세요.
set -f; IFS='
'
mv $(ls -cr /app/path1/path2/* | head -n 2) /app/path1/path2/path3
zsh를 쉘로 사용할 수 있다면 다음을 사용할 수 있기 때문에 훨씬 쉬울 것입니다.글로벌 예선.
mv /app/path1/path2/*(oc[1,2]) /app/path1/path2/path3