%EB%A5%BC%20%EA%B2%80%EC%83%89%ED%95%98%EC%97%AC%20%EC%83%88%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%20%EB%B3%B5%EC%82%AC%ED%95%98%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
내 디렉터리에 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로 분할하여 인수로 전달합니다.*
.
r
OG00
l
Z
xargs
0
cp
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
.
다음 내용을 읽어볼 수도 있습니다.
코드에서 흔히 발생하는 몇 가지 실수에 대해 설명합니다.