2017-09-26 3 views
0

파일이있는 파일 이름이있는 디렉토리 (전체 경로가 아님) 만 가져 오는 bash 스크립트를 준비했습니다. 파일이 하위 디렉토리에있을 때만 수행해야합니다.하위 폴더가 Linux bash에있을 때만 파일 이름이있는 현재 디렉토리 (전체 경로가 아님) 가져 오기

예 : 입력이 src/email/${sub_dir}/Bank_Casefeed.email 인 경우 출력은 ${sub_dir}/Bank_Casefeed.email이어야합니다.

입력이 src/layouts/Bank_Casefeed.layout 인 경우 출력은 Bank_Casefeed.layout이어야합니다. 나는 쉽게 이것을 basename 명령을 사용하여 얻을 수있다.

src/basefolder는 항상 상수입니다. 경우에 따라 (src/email (basefolder) 디렉토리 다음에) 하위 디렉토리가 있습니다.

이 스크립트를 사용할 수 있습니다. 출력을 얻으려면이 스크립트 (모듈이 전자 메일 인 경우에만)를 사용할 수 있습니다. 서브 디렉토리가 다른 모듈에 존재하더라도 스크립트는 작동해야합니다. 아마 전화 번호부를 세어야합니까? 두 개 이상의 디렉토리 (src/basefolder)가 있으면 스크립트는 하위 디렉토리를 가져와야합니다. 두 시나리오를 모두 처리하는 더 좋은 방법이 있습니까?

#!/bin/bash 
filename=`basename src/email/${sub_dir}/Bank_Casefeed.email` 
echo "filename is $filename" 

fulldir=`dirname src/email/${sub_dir}/Bank_Casefeed.email` 
dir=`basename $fulldir` 
echo "subdirectory name: $dir" 

echo "concatenate $filename $dir" 
Entity=$dir/$filename 
echo $Entity 

답변

1

알고 계신 것보다 쉬운 방법이 있습니다. 하지만 당신은 입력 문자열을 조작 할 수 있다고 생각합니다. 예 :

#!/bin/bash 

sub_dir='test' 
DIRNAME1="src/email/${sub_dir}/Bank_Casefeed.email" 
DIRNAME2="src/email/Bank_Casefeed.email" 

echo $DIRNAME1 | cut -f3- -d'/' 
echo $DIRNAME2 | cut -f3- -d'/' 

이렇게하면 처음 두 개의 디렉토리가 제거됩니다.

2

사용 쉘 매개 변수 확장 :

sub_dir='test' 
files=("src/email/${sub_dir}/Bank_Casefeed.email" "src/email/Bank_Casefeed.email") 

for f in "${files[@]}"; do 
    if [[ $f == *"/$sub_dir/"* ]]; then 
     echo "${f/*\/$sub_dir\//$sub_dir\/}" 
    else 
     basename "$f" 
    fi 
done 
test/Bank_Casefeed.email 
Bank_Casefeed.email 
+0

감사 글렌. sub_dir은 무엇이든 될 수 있습니다. 파일은 런타임 중에 다른 스크립트에 의해 작성됩니다. 그래서이 스크립트에서는 sub_dir 이름을 설정할 수 없습니다. 텍스트 파일에있는 파일 목록. 저것을 취급하는 방법 있는가? – Ela

+0

그 의견이 귀하의 질문에 어떻게 들어 맞는 것인지 이해할 수 없습니다. 도움이 되나요? http://mywiki.wooledge.org/BashFAQ/001 –