2015-02-07 3 views
0

동일한 제목을 가진 파일 쌍 (확장명이 아님)에 대해 2 개의 디렉토리를 찾고 새 명령 내에서 해당 제목을 병합해야합니다.동일한 파일 쌍을 찾는 중

for file in ./files/* do; 
title=$(base name "file") 
print title 
done 

를 반복하는 파일의 전체 이름을 선택 할 파일

1) 일반적으로 내가 for 루프 내에서 다음 명령을 사용의 이름을 인쇄하는 방법을 처음으로 내가해야 위의 스크립트에서 파일의 이름 만 제목으로 인쇄하고 확장명은 인쇄하지 않도록 변경하십시오. 두 파일은 전자 그들을 더블 루프를 수행하는 같은 이름이 있는지 여부를 확인하려면 몇 가지 조건을 추가하는 방법의 수

2), g

# counter for the detected equal files 
i=0 
for file in ./files1/* do; 
title=$(base name "file") #change it to avoid extension within the title 
for file2 in ./files2/* do; 
title2=$(basename "file2") #change it to avoid extension within the title2 
if title1==title2 
echo $title1 and $title2 'has been found!' 
i=i+1 

수행 도움을

감사합니다! 글레이브

+0

http://www.shellcheck.net/에서 아이디어에 대한 너무 많은 – Cyrus

답변

1

do과 같은 구문 오류를 수정하여 시작할 수 있습니다. 다른 방법으로 사용해야하는 경우 ;과 같이 시작할 수 있습니다.

그리고, 쉘은 변수의 시작 (##, #) 및 단부 (%%, %)에서 서브 스트링을 제거 연산자를 가지고있다. 여기에, 즉 오른쪽에서 글로브 .* 일치하는 가장 짧은 부분을 제거, 확장하지 않고 파일을 나열하는 방법은 다음과 같습니다

for file in *; do 
    printf '%s\n' "${file%.*}" 
done 

는 이러한 연산자에 대해 알아 셸 설명서를 참조하십시오. 프로그래밍 경력을 통해 여러 번 지불하게 될 것입니다 :-)

추한 값 비싼 파이핑과 basename, cut, awk 등으로 포크를 사용한다고 말하는 사람은 믿지 마십시오. 그것은 모두 과잉이다.

한편으로는 목표 달성을위한 더 나은 방법이 있습니다. 이 같은 파일이 있다고 가정

$ find files1 files2 
files1 
files1/file1.x 
files1/file3.z 
files1/file2.y 
files2 
files2/file1.x 
files2/file4.b 
files2/file3.a 

지금 파일 이름이 개 목록을 생성, 확장 제거 :

ls files1 | sed -e 's/\.[^.]*$//' | sort > f1 
ls files2 | sed -e 's/\.[^.]*$//' | sort > f2 

comm 유틸리티 테스트를 두 파일에 공통의 선을 위해 :

$ comm f1 f2 
       file1 
file2 
       file3 
     file4 

첫 번째 열에는 f1의 행만 표시되고 두 번째 열은 f2에만 표시되며 세 번째 열은 모두에 공통입니다. -1-2-3 옵션을 사용하면 원하지 않는 열을 억제 할 수 있습니다. 당신은 단지 일반적인 파일 (세 번째 열)를 계산 실행해야하는 경우

$ comm -1 -2 f1 f2 | wc -l 
     2 
+0

감사를 봐! 패턴에 의해 만들어진 파일의 제목을 정확하게 폴더에있는 파일과 관련된 새로운 변수와 연관시킬 수 있습니까? 다음 단계에서 같은 이름을 가진 파일과 이름을 일치시킬 필요가 있지만 동일한 dit을 가진 쌍을 찾으려면 다른 dir과 다른 확장자를 사용해야합니다.내 생각을 중첩 루프로 사용하여 어떻게 수행 할 수 있는지 보여 줄 수 있습니까? 사실 나는 모든 프로그래머가 단지 과학적 데이터의 분석을 돕기 위해 쉘을 사용하지는 않는다 :) 고마워! – user3470313

+0

@ user3470313이 약간 다른 생각은 동일한 대답을 제공합니까? 1) 두 디렉토리 각각에 대해 확장자없이 정렬 된 파일 목록을 만듭니다. 2) 파일 목록을 비교하여 각 파일에 대해 "목록 1에만 있음", "목록 2에만 있음", "두 목록에 있음"을 알려줍니다. – Jens

+0

좋은 소리는 들지만 쉘로 목록을 만드는 법을 모르겠다. 파이썬에서 해냈다.) 그래서 나는 스크립트의 예제에 감사 할 것이다. 1) 이름과 관련된 각각의 루핑 파일에 대해 새로운 변수를 만들 것이다. 확장자가 없거나 대안으로 이름을리스트에 넣는다. 2) 두리스트의 요소를 비교한다. 감사! Gleb – user3470313

관련 문제