여러 디렉터리에서 최근 수정된 파일 복사

여러 디렉터리에서 최근 수정된 파일 복사

나는 디렉토리 구조를 가지고 있습니다 adc/asd/abc.20150918_150635.gz... adc/asd/abc.20150921_140748.gz( .gz파일 이름에는 생성 타임 스탬프가 포함되어 있습니다). 예를 들어, asd와 유사한 다른 디렉토리가 많이 있습니다. adc/gmf/abc.20150918_010738.gz, adc/ret/abc.20150921_140748.gz, 모두 타임스탬프가 있는 파일을 포함합니다.

단일 명령을 사용하여 모든 디렉터리(예: 에서 등)에서 asd최신 gmf수정 ret된 파일을 복사 하고 싶습니다. :).

시도했지만 cp "adc/*/abc.* ."모든 파일이 복사됩니다. (단일 명령을 사용하여) 최근에 수정된 파일만 복사하고 싶습니다. 누가 날 도울 수 있죠?

답변1

(.)각 디렉토리에 대한 최신 일반 파일을 찾으려면 (/)먼저 디렉토리를 찾은 다음 각 디렉토리에서 최신 파일을 찾는(mtime 또는 ) 2단계 접근 방식이 (om[1])가장 적합할 것입니다. ZShell의 경우 다음과 같습니다.

% typeset -a latest
% cd $TMPDIR
% mkdir latest
% cd latest/
% mkdir a b c 
% touch {a,b,c}/blah; sleep 3; touch {a,b,c}/a\ newer\ file
% for d in *(/N); do latest+=( $d/*(.om[1]) ); done
% [[ $#latest -eq 0 ]] && print uh oh
% print -l $latest
a/a newer file
b/a newer file
c/a newer file
% 

설명할 수 없는 이유로 ZSH에서 해당 옵션을 활성화하지 않는 한 (모든 파일이 발견되었다고 가정하면) 이것 cp $latest destdir으로 충분합니다. SH_WORD_SPLIT이 경우 다른 쉘과 마찬가지로 인용 문제를 처리해야 합니다.

답변2

cp $(ls -1t */*/* | head -n 1) destdir

이는 전체 파일 목록이 사용 가능한 매개변수 목록 공간에 맞는다고 가정합니다(그렇지 않으면 "매개변수 목록이 너무 깁니다" 오류가 발생함).

ls -1t인수를 수정 시간 순서(최신 항목 먼저, option -t)로 정렬하고 한 줄에 하나의 파일을 표시합니다( -1option). head -n 1첫 번째 줄만 채워집니다.

이는 명령줄로 대체되어 로 끝납니다 cp newestfile destdir.

관련 정보