가장 오래된 파일을 동일한 디렉토리에 보관하는 방법

가장 오래된 파일을 동일한 디렉토리에 보관하는 방법

"../in/"과 "../temp/"라는 2개의 디렉토리가 있습니다. 내 질문은 가장 오래된 파일이나 디렉터리를 동일한 ../in/ 디렉터리에 유지하고 나머지 파일이나 디렉터리를 ../temp/ 디렉터리로 이동하는 bash 스크립트를 작성하는 방법입니다.

답변1

파일 이름에 공백이나 개행 문자가 없다고 가정하면 이를 수행하는 더 쉬운 방법이 있습니다. 현대 세계에서는 이것을 가정할 수 없으며, 게다가 너무 취약해서 그러한 합법적인 파일 이름이 발견되면 스크립트가 실패하는 스크립트를 작성하는 것은 나쁜 형식입니다.

안전을 확보하려면 다음 명령을 사용하십시오(GNU 도구가 필요할 수 있음).

find ../ini/ -type f -printf '%T@ %p\0' | sort -nz | sed -Ezn '2,$s/[^ ]* //p' | xargs --null mv -t ../temp/

../ini/이렇게 하면 가장 오래된 파일을 제외한 모든 파일이 ../temp/.

어떻게 작동하나요?

  • find ../ini/ -type f

    그러면 디렉토리에 있는 모든 일반 파일이 검색됩니다 ../ini.

  • -printf '%T@ %p\0'

    그러면 null로 구분된 문자열에 있는 파일의 타임스탬프와 이름이 인쇄됩니다.

  • sort -nz

    Null로 구분된 문자열을 숫자로 정렬합니다. 이 작업이 완료되면 가장 오래된 파일이 먼저 나열됩니다.

  • sed -Ezn '2,$s/[^ ]* //p'

    첫 번째 파일을 제외한 모든 파일 이름이 인쇄됩니다. 또한 타임스탬프도 제거됩니다.

  • xargs --null mv -t ../temp/

    그러면 mv해당 파일에 대한 명령이 실행되어 해당 파일이 ../temp/디렉터리로 전송됩니다.

NULL로 구분된 항목을 지원하지 않는 도구를 사용하세요.

위의 가상 도구는 \0개별 프로젝트를 지원합니다. 최신 버전의 Linux(GNU)는 이를 지원합니다. 지원되지 않는 운영 체제를 사용할 경우 몇 가지 해결 방법이 있습니다. 다음 항목은 줄 바꿈으로 구분되므로 이전 도구와 호환되어야 합니다.

find ../ini/ -type f -printf '%T@ %p\n' | sort -n | sed -En '2,$s/[^ ]* //p' | xargs -d'\n' mv -t ../temp/

파일 이름에 개행 문자가 포함되어 있으면 이 작업이 실패합니다.

관련 정보