Bash-문자열이 포함 된 파일을 디렉토리로 이동


0

작업 : 2 개의 인수를받는 스크립트를 만듭니다.

3.sh <directory> <destination>

파일 내용에서 <directory>하위 문자열“ moveme ” 의 파일을 검색하십시오 . 문자열이 포함 된 파일을 디렉토리로 이동하십시오.<destination>

내 배쉬 :

#!/bin/bash

if [ "$1" == "" ]; then
    echo "Retry..."
else
    if [ "$2" == "" ]; then
        echo "Retry ..."
    else
        echo "Try to fiend in folder {$1} files with this content {123} "
        grep -l "123" $1/*
        #grep -c "123" $1/*
    fi
fi

질문 : 찾은 파일을 한 디렉토리에서 다른 디렉토리로 전송하는 방법은 무엇입니까?


mv $directory/$file $destination/$file?
NickW

물론입니다. 그러나 구체적으로 어떤 파일을 제출합니까?
HerrGrau

$ file-> grep에서 resoult을 얻는이 변수에 쓰는 방법
HerrGrau

grep을 포함하는 변수를 설정하고 while 루프를 설정하고 파일 인 경우 새 디렉토리로 이동하십시오.
NickW

그래, 이론 상으로는 어떻게 만드는지 이해하지만 실제로는? .. :(
HerrGrau

답변:


0

grep파일 목록을 반환합니다. mv각 파일 을 실행해야 합니다.

xargs다른 답변에서 제안한대로 사용할 수는 있지만이 라이너를 선호합니다.

for file in $(grep -l "123" $1/*); do mv $file $2; done

반환 된 파일 목록을 반복 grep하여 하나씩 이동합니다.

몇 가지 오류 검사를 추가해야 할 수 있으므로 여기에 더 읽기 쉬운 버전이 있습니다.

for file in $(grep -l "123" $1/*); do
    mv $file $2;
done

또한 일반적으로 이러한 종류의 루프 전에 IFS 변수를 변경하는 것이 좋습니다.

export IFS=$'\n'

이렇게하면 이름에 공백이있는 파일에 많은 문제가 발생하지 않습니다 (줄 바꿈 문자가 포함되어 있지 않은 경우).


<n> 파일 및 <m> 일치 파일의 경우 xargs 메소드는 grep<n> 번 및 mv<m> 번 호출합니다 . for 루프는 grep한 번만 호출 합니다.
GnP

IFS를 변경하는 것은 공백에서 끊어지는 명령을 수정하는 것이 좋습니다. 파일을 반복하려면 사용 방법 find-exec기능이 더 좋습니다 . 또한 변수를 큰 따옴표로 묶어야합니다.
slhck

0
str="moveme"
find "$1"/* -prune -type f -exec grep -l "$str" "{}" \; | xargs -i echo mv -i "{}" "$2"/

실제로, 아니오를 확인하십시오. $ 2를 확인하는 것으로 충분합니다

if [ "$2" == "" ]; then
        echo "Retry ..."

더 중요한 것은 $ 2의 파일에 가능한 덮어 쓰기를 처리해야한다는 것입니다.


에서 배관하는 경우 findxargs사용find … -print0 | xargs -0
slhck

감사. 주석에서 파일 이름으로 \ n을 피하는 방법을 배웠습니다.
chingNotCHing

0
#!/bin/bash

if [ "$1" == "" ]; then
    echo "Retry... ./3.sh {folder_from}/ {text} {folder_to}/"
else
    if [ "$2" == "" ]; then
        echo "Retry ... ./3.sh {folder_from}/ {text} {folder_to}/"
    else
        echo "Try to find in folder {$1} files with this content {123} "
        cd ~/tasks/$1
        grep -l "123" * > list.txt
        while read line
        do
            name=$line
            mv $line  ~/tasks/$3/$line
        done < list.txt
        #grep -c "123" $1\/*
        rm list.txt
    fi
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.