특정 파일을 grep하고 해당 특정 파일을 복사합니다.

특정 파일을 grep하고 해당 특정 파일을 복사합니다.

이것은 내 파일이며 출력은 다음과 같습니다.ll | awk '{print $9}'

thread_dump_10-10-22_10:00:01*
thread_dump_10-10-22_10:05:01*
thread_dump_10-10-22_10:10:01*
thread_dump_10-10-22_10:15:01*
thread_dump_10-10-22_10:20:01*
thread_dump_10-10-22_10:25:01*
thread_dump_10-10-22_10:30:01*
thread_dump_10-10-22_10:35:01*
thread_dump_10-10-22_10:40:01*
thread_dump_10-10-22_10:45:01*
thread_dump_10-10-22_10:50:01*
thread_dump_10-10-22_10:55:01*
thread_dump_10-10-22_11:00:01*
thread_dump_10-10-22_11:05:01*
thread_dump_10-10-22_11:10:01*
thread_dump_10-10-22_11:15:01*
thread_dump_10-10-22_11:20:01*
thread_dump_10-10-22_11:25:01*
thread_dump_10-10-22_11:30:01*
thread_dump_10-10-22_11:35:01*
thread_dump_10-10-22_11:40:01*
thread_dump_10-10-22_11:45:01*
thread_dump_10-10-22_11:50:01*
thread_dump_10-10-22_11:55:01*
thread_dump_10-10-22_12:00:01*
thread_dump_10-10-22_12:05:01*
thread_dump_10-10-22_12:10:01*
thread_dump_10-10-22_12:15:01*
thread_dump_10-10-22_12:20:01*
thread_dump_10-10-22_12:25:01*
thread_dump_10-10-22_12:30:01*
thread_dump_10-10-22_12:35:01*
thread_dump_10-10-22_12:40:01*
thread_dump_10-10-22_12:45:01*
thread_dump_10-10-22_12:50:01*
thread_dump_10-10-22_12:55:01*

내 문제는 11시 30분에서 12시 30분 사이에 파일을 특정 폴더에 복사하는 것입니다. 출처: /home/Downloads/thread_dumps목적지:/home/test

답변1

명령을 사용 find하고 모든 파일이 동일한 패턴(시간으로 끝남)을 따른다고 가정합니다.

find /home/Downloads/thread_dumps \( -name  '*11:[3-5][0-9]:*' -o -name '*12:[0-2][0-9]:*' -o -name '*12:30:[0-5][0-9]*' \) -exec cp --target-directory=/home/test {} +

위의 명령은 파일을 복사합니다. 12:30:??(시간이 12:31 이상인 경우 파일은 고려되지 않습니다.)

파일을 원하지 않으면 12:30다음 find명령을 사용해야 합니다.

find /home/Downloads/thread_dumps \( -name  '*11:[3-5][0-9]:*' -o -name '*12:[0-2][0-9]:*' \) -exec cp --target-directory=/home/test {} +

답변2

grepShell glob을 사용하면 또는 같은 다른 명령에 의존하지 않고도 원하는 것을 얻을 수 있습니다 find. 여기에는 타임스탬프가 12:30인 파일이 포함됩니다.

cp /home/Downloads/thread_dumps/thread_dump_10-10-22_11:[345]* \
   /home/Downloads/thread_dumps/thread_dump_10-10-22_12:[012]* \
   /home/Downloads/thread_dumps/thread_dump_10-10-22_12:30* \
   /home/test

참고로 여기서 마지막 *와일드카드*그리고 그것은 당신의 파일이 가지고 있는 것처럼 보이는 것과는 아무런 관련이 없습니다.

답변3

간단히 이 파일을 복사하면 일치하는 쉘 글로브가 생성됩니다.

cp /home/Downloads/thread_dumps/thread_dump_10-10-22_11:[345]?:?? /home/test
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_12:[12]?:?? /home/test
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_12:30:00 /home/test

세 개의 명령으로 함께 넣었지만 원하는 경우 세 가지 소스 패턴을 모두 동일한 cp명령에 넣을 수 있습니다. 세 개의 개별 인수로 직접 넣거나 {x,y,z}중괄호 확장을 사용하여 결합할 수 있습니다. 여기서 했던 것처럼:

# Assuming `bash` or `ksh`
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_{11:[345]?:??,12:[12]?:??,12:30:00} /home/test

12:30 파일을 포함하지 않으려면 세 번째 명령(또는 패턴)을 생략하세요.

[...]구성 요소는 포함된 문자와 일치합니다. ?단일 문자와 일치합니다 . (아마도 *0개 이상의 문자와 일치하는 에 가장 익숙할 것입니다 .)

답변4

그리고 zsh:

cp thread_dump_10-10-22_??:??:??(e['
  [[ $REPLY[-8,-1] > 11:30 && REPLY[-8,-1] < 12:31 ]]']) /home/test

이는 eglob 한정자를 사용하여 일부 코드의 평가를 기반으로 파일을 선택합니다 e(고려할 파일은 변수에 있음 $REPLY). 여기서는 파일명의 마지막 8자를 문자열 비교하여 11:30:00부터 12:30:59까지로 끝나는 파일을 선택합니다.

관련 정보