2014-08-29 2 views
0

bash 스크립트가 실행되는 디렉토리에 출력 파일이 저장되도록 출력 대상을 지정할 수 없다는 명령이 있습니다.각 디렉토리에 cd를 가진 Bash 실행 명령

find | xargs ipython nbconvert 

이렇게하면 각 하위 디렉터리의 변환 된 모든 파일이 명령이 실행되는 디렉터리에 저장됩니다. 각 파일의 현재 디렉토리에 변환 된 파일을 출력하고 싶습니다.

그런 다음 출력 디렉토리 옵션이없는 명령의 대상을 어떻게 지정합니까?

나는 각 파일이 디렉토리에 저장 가도록 (듯이)

find | convert . 

같은 것을 실행하려는.

답변

2

find | xargs은 공백이나 다른 비정상적인 문자가있는 파일 이름이 문제를 혼동시킬 수 있으므로 좋지 않은 아이디어입니다. 다행히도 find에는 -execdir이라는 플래그가 붙어 있습니다.

find -execdir ipython nbconvert {} \; 

자세한 내용은 find manpage을 참조하십시오. 코멘트에 밖으로


@chepner으로 포인트를 잘 작성하지 find의 모든 버전은 -execdir 기능을 지원합니다. 그렇지 않은 경우 출력이 개별 행에 있다는 사실을 활용하고 프로그램을 실행하기 전에 cd을 적용하여 각 결과를 반복하는 while 루프를 만들 수 있습니다. 당신은 항상 첫 번째 인자의 디렉토리에 실행 않으려면

find | while read line; do 
    cd "$(dirname "$line")" 
    ipython nbconvert "$line" 
done 

는 또한, 파이썬 자체 내에서이 작업을 수행 할 수 있습니다. 당신이 sys.argv 대신 고급 옵션 파서 중 하나를 사용하는 경우, 당신은 당신의 파이썬 스크립트의 처음으로 이런 일을 추가 할 수 있습니다

if __name__ == '__main__': 
    import os 
    import os.path 
    import sys 
    os.chdir(os.path.dirname(sys.argv[1])) 

당신은 또한 당신의 출력 파일에 대한 명시 적 경로를 지정할 수 있습니다 때를 open

with open(os.path.join(os.path.dirname(sys.argv[1]), 'name_of_output_file.txt') as fb: 
    pass # your code here 
+1

'-execdir'는 POSIX 표준의 일부가 아니므로'find '의 일부 버전에서는 지원하지 않을 수 있습니다. 그러나 GNU'find'와 Mac OS X (그리고 모든 BSDs)와 함께 제공되는 버전은 그렇습니다. – chepner

관련 문제