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

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

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

전: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 ./'{}' \;

관련 정보