![필터를 사용하여 실행 가능한 프로그램을 실행하는 방법](https://rvso.com/image/38676/%ED%95%84%ED%84%B0%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%8B%A4%ED%96%89%20%EA%B0%80%EB%8A%A5%ED%95%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
쉘 스크립트를 실행하고 싶습니다. 이 스크립트는 이름이 깁니다. 그래서 파일에 필터를 사용하고 싶습니다.
전: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 ./'{}' \;