2017-12-06 1 views
-2

디렉토리의 파일 목록 중에서 특정 파일 형식을 선택하고 싶습니다. 아래의 예를 찾으십시오.폴더의 특정 파일 선택

아래 목록의 파일 (6 개 파일)이 있습니다.

설정 한
1) MAG_L_NT_AA_SUM_2017_01_20.dat
2) MAG_L_NT_AA_2017_01_20.dat

집합 -2-
1) MAG_L_NT_BB_SUM_2017_01_20.dat
2) MAG_L_NT_BB_2017_01_20.dat

세트 -3-
1) MAG_L_NT_CC_SUM_2017_01_20.dat
2) MAG_L_NT_CC_2017_01_20.dat

위의 세 세트에서 나는 단지 3 개의 파일 만 필요합니다.
1) MAG_L_NT_AA_2017_01_20.dat
2) MAG_L_NT_BB_2017_01_20.dat
3) MAG_L_NT_CC_2017_01_20.dat

참고 : 나는 위의 REQ에 대한 스크립트를 작성해야하기 때문에 명령이 여러 줄이있을 수 있습니다. 감사 문제에 아마도 가장 쉽고 복잡한 솔루션 및 grep (패턴 일치하는 라인을 인쇄 도구) (디렉토리 계층에서 파일을 검색하기위한 도구) find 결합되어

답변

0

. man findman grep을 입력하여 해당 도구 설명서를 읽을 수도 있습니다.

솔루션으로 곧장 가기 전에 문제를 어떻게 해결할 것인지 이해해야합니다. 일치

-name패턴 파일 이름 (제거 선두 디렉토리와 경로)의

자료 : 우리가 옵션 -namefind 명령을 사용합니다 검색 할 파일의 이름 패턴을 찾으려면 셸 패턴 패턴. 메타 문자 ('*', '?'및 '[]') 은 '.' 기본 이름의 시작 부분 ( findutils-4.2.2의 변경 사항, 아래의 표준 준수 사항 참조). 디렉토리와 그 아래의 파일을 무시하려면 -prune을 사용하십시오. -path에 대한 설명의 예를 참조하십시오. 중괄호는 쉘 패턴에서 특수 의미를 갖는 Bash imbue braces를 포함하는 일부 쉘에도 불구하고 특수하다고 인식되지 않습니다. . 파일 이름 일치는 fnmatch (3) 라이브러리 함수를 사용하여 으로 수행됩니다. 쉘에서 확장으로 보호하려면 패턴을 동봉 한 을 잊지 마세요.

$ find words_directory -name "*abc*" 

을 우리가 디렉토리에있는 모든 디렉토리를 검색 할 경우 : 예를 들어

, 우리가 'words_directory'라는 디렉토리에 문자열 'ABC'를 포함하는 파일을 검색하려면, 우리는 다음을 입력합니다 : 이는 문자열 "MAG_L_NT_"을 시작하고로 끝

$ find words_directory/* -name "*abc*" 

그래서 첫째, 우리는 모든 파일을 찾아야합니다 거기에 제공,

$ find /your/specified/path/* -name "MAG_L_NT_*.dat" 

그러나이 모든 발견 파일 이름을 인쇄,하지만 우리는 여전히 "SUM" 문자열이 포함 된 이름을 얻을 :, 따라서이 패턴과 일치하는 파일을 포함 할 수있는 많은 하위 디렉토리를 포함 /your/specified/path/에 일치하는 모든 이름을 찾을 수 grep. 우리는 옵션 -v을 사용합니다 원치 않는 문자열이 포함 된 이름을 제외하려면 :

-v

, --invert 경기

반전 일치의 감각을, 일치하지 않는 행을 선택합니다. (-v는 POSIX 의해 지정된다.)

는 걸러 그렙를 사용하려면, 우선 사용을 출력 명령 () | :

배관 용 표준 쉘 구문은 여러 명령을 나열하는

, 은 수직 막대로 구분됩니다 (일반적인 유닉스 어휘에서 "파이프"). 예제의 경우 현재 디렉토리 (ls)의 파일을 나열하고 문자열 "key"(grep)가 포함 된줄의 ls 출력 만 유지하고 결과를 스크롤 페이지 (less)에 표시하면 사용자가 단말기의 명령 줄에 다음

ls -l | grep key | less 

"의 LS -l"이 프로세스의 출력 (stdout) 어느 에 파이프되어 생산 "그렙 키"를위한 프로세스의 입력 (표준 입력) ; 마찬가지로 "less"프로세스 인 에 대해서도 마찬가지입니다. 각 프로세스는 이전 프로세스 에서 입력을 받아 표준 스트림을 통해 다음 프로세스의 출력을 생성합니다. 각 "|" (익명) 파이프 이라고하는 프로세스 간 통신 메커니즘 에 의해 명령의 표준 출력을 의 오른쪽에있는 명령의 표준 입력에 연결하도록 쉘에게 알립니다. 파이프는 단방향입니다. 데이터 은 파이프 라인을 통해 왼쪽에서 오른쪽으로 흐릅니다. 당신이 언급 한 명령과 당신의 목표를 달성하는 데 사용되는 옵션에 익숙해있어 후

process1 | process2 | process3 

, 당신은 솔루션을 준비 :

$ find /your/specified/path/* -name "MAG_L_NT_*.dat" | grep -v "SUM" 

이 명령은 시작하는 모든 이름의 출력을 생성합니다 "MAG_L_NT_"이고 ".dat"로 끝납니다.grep -v은 첫 번째 명령 출력을 입력으로 사용하고 "SUM" 문자열을 포함하는 모든 행을 제거합니다.

+0

괜찮습니다. – sudheer113

+0

@ sudheer113, 내가 질문에 답변했다면 [내 대답을 올바른 것으로 표시] (https://stackoverflow.com/help/someone-answers), 댓글 섹션도 전용되어야합니다. 문제에 대해 이야기하고, 답변을 주셔서 감사합니다 (당신은 upvoting에 감사 할 수 있습니다). 일반 규칙 [https://stackoverflow.com/help/asking]에 대해 자세히 알아보십시오. – Lycopersicum