"../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/
파일 이름에 개행 문자가 포함되어 있으면 이 작업이 실패합니다.