필터를 사용하여 실행 가능한 프로그램을 실행하는 방법

필터를 사용하여 실행 가능한 프로그램을 실행하는 방법

쉘 스크립트를 실행하고 싶습니다. 이 스크립트의 이름은 매우 깁니다. 그래서 파일에 필터를 사용하고 싶습니다.

전임자:ls | grep myfile | ./

필터를 사용하여 파일을 실행할 수 있습니까?

답변1

다음을 입력하세요.

*myfile*

다음과 같이 할 수도 있습니다.

"$(ls | grep pattern)"

파일 이름 와일드카드뿐만 아니라 전체 정규식과 일치하는 경우.

이러한 모든 솔루션은 현재 디렉터리에 패턴과 일치하는 파일이 하나만 있다고 가정합니다.

답변2

당신은 그것을 사용할 수 있습니다xargs이런 종류의 경우:

ls | grep myfile | xargs sh

xargs입력의 행을 읽고 이를 인수로 제공된 프로그램에 인수로 제공합니다. 여기서는 grep의 출력을 읽은 다음 실행합니다 sh long_myfile_name. (스크립트가 Bash 특정 기능이나 다른 셸에 의존하는 경우 이를 sh다음으로 변경하세요)bash

이 간단한 경우에도 sh *myfile*기본적으로 동일한 효과를 실행할 수 있습니다. grep사례가 더 복잡하면 이 작업을 수행할 수 없지만 sh "$(ls | grep ...)"작동할 것입니다.


즉, 이 작업을 원하지 않을 수 있는 몇 가지 이유가 있습니다: 특히 어떤 시점에 두 개의 파일이 있을 수 있는 경우 grep이 시점에서 세 가지 중 하나가 발생합니다: 스크립트가 추가 인수를 얻고 두 개의 다른 스크립트를 실행합니다. , 또는 다른 스크립트를 실행하세요. 예를 들어, 파이핑을 통해 처음 두 개를 피할 수 있지만 head -n 1그러면 둘 중 하나가 실행되므로 별로 도움이 되지 않습니다. 이 $()경우에는 실패할 뿐입니다. 이는 아마도 일련의 나쁜 결과 중 가장 좋은 결과일 것입니다. 파일 이름에 공백이 있으면 더욱 주의해야 합니다.

셸의 탭 완성이 더 나은 옵션일 수 있습니다. *myfile*TAB을 입력하고 눌러 올바른 확장을 얻거나 둘 이상의 가능성이 있음을 나타내거나 이름과 탭 완성을 끝까지 쓰기 시작할 수도 있습니다. 스크립트에서 실행하는 경우 전체 이름을 거기에 입력하면 됩니다. 한 번만 작성하면 됩니다. 위의 답변은 효과가 있지만 실제로는 권장하지 않습니다.

답변3

xargs예를 들어 다음을 사용할 수 있습니다 .

ls | grep myfile | xargs bash

아니면 필터를 사용하세요find

find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;

관련 정보