한 디렉터리에서 다른 디렉터리로 최신 파일 이동

한 디렉터리에서 다른 디렉터리로 최신 파일 이동

한 디렉터리에서 다른 디렉터리로 최신 파일을 이동하려고 합니다. 이 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출력을 사용할 때 출력을 처리 하려면 -0null 문자로 구분해야 합니다 \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=Cls비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

관련 정보