2014-06-13 4 views
0

우선 Google과 Stackoverflow에서 유사한 주제를 검색하려고했지만 비슷한 것을 찾지 못했습니다.셸에서 포킹 파이프 라인

질문 :

쉘에서 분기 pipeling 처리 할 수있는 방법이 있나요?

예 :

I 다음 디렉토리 트리를했습니다 :

> 1 
>> 1.a 
>> 2.a 
>> 3.a 
> 2 
>> 1.b 
>> 2.b 
>> 3.b 

나는 명령을 실행하는 경우 :

1 1/1.a 
2 1/2.a 
3 1/3.a 
4 2/1.b 
5 2/2.b 
6 2/3.b 
: 나는 다음과 같은 출력을 얻을

ls -1 */* | nl 

첫 번째 열을 참조하려면 -f1 매개 변수와 함께 cut을 사용하십시오. 마찬가지로 두 번째 열을 참조하려면 -f2 매개 변수를 사용합니다. 아래 명령을 어떤 방식으로 사용해도 될까요?

ls -1 */* | nl | mv `cut -d' ' -f1` `cut -d' ' -f2` 

파일 이름을 바꾸는 데는 신경 쓰지 않아도됩니다. 사실 쉘에 병렬 파이프 라이닝이 있는지 알고 싶습니다.

+3

여기에서 달성하려는 것은 무엇입니까? 'mv'를 해석하면'mv1 1.a'와 같은 것을하려고하는 것처럼 보입니다. 'mv 1.a 1'과 같은 것을 의미 했습니까? –

+0

죄송합니다. 디렉토리 접두어를 잊어 버리 셨습니다.'mv 1/1.a 1' – displayer

답변

1

당신은 루프를 위해 이것을 사용할 수 있습니다

다음
while read -r f1 f2; do 
    [[ -n "$f1" && -n "$f2" ]] && mv "$f1/$f2" "$f2" 
done < <(ls -1 */* | nl) 

비 BASH 스크립트입니다 :

ls -1 */* | nl | while read -r f1 f2; do 
    [ -n "$f1" ] && [ -n "$f2" ] && mv "$f1/$f2" "$f2" 
done 
+0

OP는'BASH' 태그를 사용했기 때문에'[...] '를 사용하는 것이 낫습니다 '[...]' – anubhava

+0

@GoodPerson :'[[','&&'는'['(아마도 당신이 주장하는 것)과 함께 사용할 수없는 옵션입니다. 질문에 태그가 붙어 있기 때문에, Bash만의 해결책은 OK입니다. 쉘도 태그가 붙어 있기 때문에, 중립적 인 해결책은 좋을 것입니다. –

+2

이식성이 문제가 되더라도, POSIX 사양은 [[-n "$ f1"] && [-n "$ f2"]'over'[-n "$ f1"-a -n "$ f2"] '. – chepner

2

ls의 출력을 구문 분석 strongly discouraged이다; 대신 다음을 사용합니다.

count=1 
for f in */*; do 
    echo mv "$f" $((count++)) 
done