쉘의 디렉토리에서 grep과 mv를 함께 사용하는 방법은 무엇입니까?

쉘의 디렉토리에서 grep과 mv를 함께 사용하는 방법은 무엇입니까?

"TEST"를 위해 디렉터리에 있는 모든 파일의 내용을 어떻게 파악한 다음 해당 파일을 다른 디렉터리(예: 홈 디렉터리)로 이동합니까?

답변1

결합할 수 있습니다.grep그리고찾다이 작업의 경우:

find SOURCE -maxdepth 1 -type f -exec grep -q TEST {} \; -exec mv -i {} DEST \;

작동 원리

  • find SOURCE -maxdepth 1 -type f-type f디렉토리에 있는 모든 파일( )을 찾습니다.원천.

    하위 디렉터리에도 파일을 포함하려면 -maxdepth 1.

  • -exec grep -q TEST {} \;문자열에 대해 파일을 하나씩 grep합니다.시험. 여기에 {}현재 처리 중인 파일이 있습니다.

    스위치 -q는 grep을 "조용하게" 만듭니다. 즉, 아무 것도 출력하지 않습니다. 다음과 같은 경우 진술 -exec이 참이 됩니다.grep성공합니다. 즉, 문자열을 찾습니다.

  • -exec mv -i {} DEST \;문자열이 포함된 파일을 이동합니다.시험디렉토리에목적지.

    스위치 -i는 만든다mv"대화형", 즉 다른 파일을 덮어쓰기 전에 메시지를 표시합니다.

답변2

또 다른 대안입니다(단, 일부 GNU 특정 확장이 필요합니다. "Unix"라는 질문에 태그를 지정했기 때문에 적합하지 않을 수 있습니다).

grep -lZd skip TEST SOURCE/* | xargs -0I{} mv -i {} DEST
  • grep -l

    일반 출력 대신 일치하는 파일 이름을 인쇄합니다.

  • grep -Z

    널 바이트로 구분된 출력을 제공합니다. 이는 파이프를 통해 이상한 파일 이름을 처리하는 데 안전한 방법입니다.

  • grep -d skip

    skip입력 인수 중 발견된 디렉터리에 대한 작업을 정의합니다 .

    이것은 실제로 필요하지 않습니다. grep: SOURCE/DIR: Is a directory디렉토리를 만날 때 알림을 피할 뿐입니다 . 디렉터리에 있는 파일을 재귀적으로 읽으려면 action 을 사용 recurse하거나 해당 -r스위치를 더 짧게 사용하십시오(아래 항목도 참조).

  • SOURCE/*

    SOURCE쉘을 사용하여 디렉토리의 모든 파일과 일치글로빙. 숨겨진 파일은 기본적으로 일치하지 않습니다. 이는 명령이 실행되기 shopt -s dotglob전에 Bash에서 설정하여 변경할 수 있습니다 grep.

    SOURCE/.*입력 인수에 그냥 추가하고 싶은 유혹을 느낄 수도 있지만 , ( and 도 -r일치하므로 ) with를 사용하면 예상치 못한 결과가 발생할 수 있습니다....

    재귀적 일치가 필요한 경우 -r SOURCE디렉터리 구조에 숨겨진 파일을 포함하는 입력 인수로 파일 글로빙 없이 사용하면 됩니다.

  • xargs -0

    입력을 null로 구분된 것으로 해석합니다.

  • xargs -I{}

    {}입력 인수에 대한 자리 표시자로 정의됩니다 .

  • mv -i

    실수를 피하기 위해 Dennis의 제안에 따라 이동을 대화식으로 만듭니다.

이 패턴(또는 일반적인 명령)을 테스트하려면 echo실제 명령 앞에 삽입하여 어떤 명령이 실행될지 확인하는 것이 유용한 기술입니다. 즉, mv로 변경합니다 echo mv.

답변3

$ mv 테스트* /경로/대상/목적지

나에게 효과가 있고 당신에게도 효과가 있기를 바랍니다. 내 경우에는 다음과 같았습니다.

$ mv note_[5,6]* ~/문서/노트

note_5_math.pdf 및 note_6_math.pdf를 home/documents/notes 디렉토리로 이동했습니다.

관련 정보