특정 문자가 포함된 파일을 grep하고 다른 폴더로 이동해야 함 Linux

특정 문자가 포함된 파일을 grep하고 다른 폴더로 이동해야 함 Linux

이름에 "오류" 또는 "트래픽"이 포함된 파일을 선택해야 합니다.

abc_ERRor.csv
raError.csv
bsn_Error.csv
bbbctraffic.csv
ccc_traffic.csv
...

Error_directorytraffic_directory이름에 따라 해당 디렉터리로 이동합니다 .

시도했지만 성공하지 못했습니다.

mv $(ls test_file | grep -l 'Error>' *) Error_directory

명령줄에서 이 작업을 어떻게 수행합니까?

ls test_file | grep 'Error'

답변1

ls파일 이름에 나타날 수 있는 문자가 다양하기 때문에 출력을 구문 분석하는 것은 좋은 생각이 아닙니다. 더 나은 해결책은 다음과 같습니다.

find ./test_file -iname "*error*" -print0 | xargs -0 -I {} mv {} Error_directory

-iname이 옵션 에 주의하세요 . 그러면 대소문자를 구분하지 않는 일치 항목이 반환되어 파일을 찾고 이동할 수 있습니다. 예를 들면 다음과 같습니다.

abc_ERRor.csv
error_123.csv
ErRoR_77.csv

대소문자를 구분하지 않고 검색할 필요가 없다면 다음과 같이 간단한 것으로 충분합니다.

mv test_file/*Error* Error_directory

추가 자료:

xargs 구분 기호 문제

배쉬 트랩

답변2

또 다른 가능한 해결책은 다음과 같습니다.

#!/bin/sh

err_dir=~/errors
tra_dir=~/traffic

for f in *.csv; do
    case $f in
        *[Ee][Rr][Rr][Oo][Rr]*) mv -i $f $err_dir ;;
        *[Tt][Rr][Aa][Ff][Ii][Cc]*) mv -i $f $tra_dir ;;
    esac
done

답변3

다음을 사용하여 찾을 수 있습니다.

find test_file -type f -name "*Error*" -exec mv {} Error_directory/ \;

이는 -type f파일을 찾고 있다는 의미이며, -name주어진 패턴과 일치한다는 의미입니다. exec다음 명령을 실행하고 {}주어진 찾기 매개변수와 일치하는 파일을 바꾸십시오.

Bash를 사용하고 시도한 것과 더 유사한 작업을 수행하려면 루프를 사용하면 됩니다.

for f in `ls test_file | grep 'Error'; do
  mv test_file/${f} Error_directory
done

두 예 모두에서 test_file은 관심 있는 파일이 포함된 디렉터리라고 가정합니다.

답변4

for fn in *.*; do for word in Error traffic; do echo "$fn" | grep -i "$word" && mkdir -p "$word"_directory && mv "$fn" "$word"_directory; done; done

관련 정보