2017-11-09 26 views
1

다른 파일을 찾아서 끌어 오기 위해 bash 스크립트를 작성하려고합니다. 지금까지, 나는 다음과 같은 스크립트를 내놓았다 :대시 (non-dash) 관련 잘못된 대체 오류

find ./to_compress -type f -iname "*.tar" -mindepth 1 -maxdepth 1 -exec mv {} ./compressed/${{}##*/}

bash는이 ${{}##*/} 나쁜 교체는 불평하지만

bash: ./compressed/${{}##*/}: bad substitution

주위가 간부로 인해 수 있다고 제안 인터넷 검색을 일부 bash 대신 dash을 호출했습니다. 그 이유는 다음과 같습니다.

find ./to_compress -type f -iname "*.tar" -mindepth 1 -maxdepth 1 -exec echo $0 {} \;

bin/bash xxxx으로 응답하여 bash가 실제로 exec 명령에 의해 호출되었음을 암시합니다.

이 오류의 원인은 무엇입니까? 파일 이름 만 얻고 후행하는 디렉토리를 지우려면 어떻게해야합니까?

답변

2

find 명령의 -exec 플래그의 자리 표시자는 변수가 아닙니다. 변수에 대해서만 매개 변수 확장을 수행 할 수 있습니다. 문제는 쉘이 dash 또는 bash 인 것과 아무런 관련이 없습니다. 당신이 할 수있는 일이 상황에서

이 같은 -exec, 와 sh을 실행하고 서브 쉘에 매개 변수로 {}을 통과한다 :

find ... -exec bash -c 'mv "$1" "./compressed/${1##*/}"' -- {} \; 
+0

그래는 잘 작동합니다. 고마워요. 자바와 파이썬에 대한 경험이 있었음에도 불구하고 저는 여전히 배쉬를 처음 접했습니다. '$ 1'은 파일 이름의 공백에 안전합니까? – chiffa

+1

@chiffa'{}'를 서브 쉘에 전달하는 것이 안전하며'$ 1'은 안전을 유지하기 위해 큰 따옴표로 묶어야합니다 (필자가 작성한대로) – janos

+0

과'$ {1 # # * /}'? – chiffa