쉘 스크립트를 실행하고 싶습니다. 이 스크립트의 이름은 매우 깁니다. 그래서 파일에 필터를 사용하고 싶습니다.
전임자: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 ./'{}' \;