다음과 같은 패턴을 가진 파일이 많이 있습니다.
{UID}-YYMMDD-HHMMSSMM-NEW.xml
또는 실제 예:
56959-140918-12465122-NEW.XML
파일 이름에 포함된 날짜와 시간 순서대로 이 파일을 다른 디렉터리에 복사하고 싶습니다. 또한 위 패턴과 일치하는 파일 이름에만 적용하고 싶습니다.
이를 수행하는 도구가 있습니까? 그렇지 않다면 스크립트 등을 사용할 수 있을 것 같습니다.
- 정규식을 통해 파일 이름 일치
- 정규식으로 날짜 부분을 일치시키고 날짜별로 오름차순으로 나열합니다.
- 각 날짜에 대해 정규식을 통해 시간을 일치시킨 다음 시간의 오름차순으로 나열하여 각 파일을 전역 목록에 추가합니다.
- 파일 목록 정리 후 파일 복사
답변1
일치하는 모든 파일이 현재 디렉터리에 있는 경우(하위 디렉터리에 없거나 하위 디렉터리 이름에 해당 파일이 포함되어 있지 않은 경우 -
) 1~3단계를 사용할 수 있습니다.
find -regex '.*/[0-9]+-[0-9]+-[0-9]+-NEW\.XML' | sort --field-separator=- --key=2 > filelist
4단계:
while IFS= read -r line; do
cp -v $line /PATH/TO/DESTFOLDER/
done < filelist
설명하다:정규식 패턴은 find
설명된 패턴과 모든 파일을 일치시킵니다. sort
필드를 구분하고 -
먼저 두 번째 필드(날짜)를 기준으로 정렬한 다음 후속 필드(여기서는 세 번째 필드(시간))를 기준으로 정렬합니다. 쉘에서 행이 처리되는 방식을 설명합니다.여기. 각 줄은 $line
변수 에 저장 되고 대상 폴더에 복사됩니다. 옵션은 현재 복사된 파일을 -v
표시합니다 .cp
답변2
Zsh에는 하나가 있습니다글로벌 예선글로브 정렬을 변경합니다. UID-
접두사가 제거된 파일 이름별로 정렬 하도록 지시합니다 .
cp <->-<->-<->-NEW.XML(oe\''REPLY=${REPLY#*-}'\') /somewhere/else/
(정확한 자릿수를 원할 경우 패턴을 조정하세요. <->
임의의 자릿수 순서와 일치하세요.)
파일이 복사되는 순서는 관찰할 수도 있고 관찰하지 못할 수도 있습니다. 대부분의 파일 시스템은 최소한 두 번째로 세분화된 타임스탬프를 제공하지만 각 파일을 복사하는 데 훨씬 적은 시간이 걸릴 수 있습니다. 디렉터리에는 파일의 고유한 순서가 없습니다. 복사할 첫 번째 파일이 반드시 나열된 첫 번째 파일일 필요는 없습니다 ls -f
(파일 시스템에 따라 자주 또는 드물게 발생할 수 있음).
답변3
귀하의 사례에서 제가 이해한 바는 이 패턴이 있는 파일을 파일 이름의 타임스탬프를 기준으로 해당 폴더에 복사해야 한다는 것입니다.
이렇게 하려면 파일을 반복하고 각 파일을 적절한 디렉터리로 이동할 수 있습니다.
for i in [[:digit:]]*-NEW.XML; do dirname="${i%6:6}"; mv $i $dirname; done;
ps 여기 루프는 전달된 파일과 일치하는 파일만 반복합니다.정규식.