텍스트 파일에서 별표(*)를 검색하여 새 디렉터리에 복사하시겠습니까?

텍스트 파일에서 별표(*)를 검색하여 새 디렉터리에 복사하시겠습니까?

내 디렉터리에 5000개의 텍스트 파일이 있습니다. 각 텍스트 파일 이름은 접두사로 시작됩니다.8월 00일*(예 - OG0017774.log)

파일 내에 별표(*)가 포함된 .log 파일을 새 디렉터리에 복사해야 합니다.

문서 내용 -

cat OG0017774.log

M0~b904dbe442e0eb658d229076cacb9ef6 M1~9edeedcb1f4f315c4689bacd8075222f 0.000035**
M0~b904dbe442e0eb658d229076cacb9ef6 M2~aeba83b564ee32e0ef1a8321c8d930f4 0.000671**
M0~b904dbe442e0eb658d229076cacb9ef6 M3~006a376da2fba16185ce424bf4cba983 0.000055**
M0~b904dbe442e0eb658d229076cacb9ef6 M4~e564dbfbbbe8d1f7d9d8c8e4da202943 0.000015**
M0~b904dbe442e0eb658d229076cacb9ef6 M5~2abe603e8fee2fcb08b7fb818957e0aa 0.000006**

제안해 주셔서 감사합니다.

이 코드를 시도해 보니 현재 디렉터리의 모든 파일이 새 디렉터리에 복사됩니다.

*가 포함된 모든 텍스트 파일을 복사하고 싶습니다.

#!/bin/bash
KEYWORD_PATTERN='*'
find . -type f |
while read FNAME
do
    if grep -Ew -q "$KEYWORD_PATTERN" $FNAME
    then
        KEYWORD=$(grep -Ew -o "$KEYWORD_PATTERN" $FNAME)
        cp -r $FNAME keywords/$KEYWORD
    fi

done

답변1

이런 일이 있으면 어떻게 해야 할까요?

for i in OG00*; do 
    if grep -q -F '*' "$i"; then 
        mv "$i" ../keywords/
    fi
done

답변2

GNU 도구 사용:

grep -rFlZ --include='OG00*' '*' . |
  xargs -r0 cp -t ../keywords

grep현재 디렉터리( )에서 F이름이 ist 로 시작하는 파일 중에서 ero로 구분된 일치하는 파일이 하나 이상 있는 고정 문자열을 반복적으로 검색하고 해당 출력을 s로 분할하여 인수로 전달합니다.*.rOG00lZxargs0cp

POSIX에 해당하는 내용은 다음과 같습니다.

find . -name 'OG00*' -type f -exec grep -qF '*' {} ';' \
   -exec sh -c 'exec cp "$@" ../keywords' sh {} +

이는 grep파일당 하나씩 실행한다는 의미이므로 효율성이 크게 떨어집니다.

*a 를 와 일치시키기 위한 grep옵션은 다음과 같습니다.

  • grep -F '*'고정 문자열 일치는 가장 간단하며 고정 문자열만 검색해야 하는 경우에 사용하려는 것입니다.
  • grep '*'기본 정규 표현식에서 *패턴의 시작 부분은 리터럴과 일치합니다 *. grep 'a*'0개 이상의 s 시퀀스와 일치하며 리터럴과 일치하는 or 가 a필요합니다 .grep 'a\*'grep 'a[*]'a*
  • grep -E '\*'/ grep -E '[*]'. 확장 정규식의 경우 *패턴 시작 부분의 a는 오류이므로 *이스케이프해야 합니다. 어디에서나 동일하게 적용되거나 지원 grep -P됩니다 grep -X.

다음 내용을 읽어볼 수도 있습니다.

코드에서 흔히 발생하는 몇 가지 실수에 대해 설명합니다.

관련 정보