"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 디렉토리로 이동했습니다.