이런 상황이 발생했어요많은:
저는 큰 디렉토리에 있는데 정확한 이름을 잊어버린 특정 파일을 찾고 있어서
ls
그 안에 있는 모든 파일을 보기 위해 입력했습니다.내가 원하는 파일이 보여요
이 파일을 명령줄에 매개변수로 전달해야 합니다. 파일 이름이 복잡합니다.
현재 내가 하는 일은 ls
커서/마우스로 출력을 강조 표시하고 마우스 오른쪽 버튼을 클릭한 다음 복사를 클릭하고 명령줄 프롬프트에 붙여넣는 것뿐입니다. 더 좋은 방법이 있다면 이것을 피하고 싶습니다. 탭 자동 완성에 대해 알고 있지만 때로는 abcd abce abcf abcg abcz23 유형 파일과 같은 경우가 있으므로 몇 가지 제안 사항이 없으면 탭 완성이 약간 투박할 수 있습니다. 예를 들어, 출력물을 클립보드에 복사할 수 있더라도 ls
다른 파일 이름도 클립보드에 복사하지 않도록 내가 원하는 파일로 범위를 좁힐 수 있는 방법이 필요합니다.
답변1
확인하다fzf
, 이는 큰 목록에서 일치하는 항목을 찾는 것과 같은 작업에 이상적입니다.
# Launches an interactive selector listing all the contents of the current
# directory and prints the selected item, storing it in $result
$ result=$(ls | fzf)
답변2
당신이 사용할 수있는배쉬 select
건설*
원하는 파일 이름이 포함될 것이라고 확신하는 "무료" 와일드카드 패턴( )을 사용하세요 .
원하는 디렉터리(또는 와일드카드가 포함된 전체 경로)로 변경한 후 다음을 수행하세요.
select mine in *
do
your-command "$mine"
done
원하는 파일에 해당하는 번호를 입력하면 bash가 해당 파일 이름을 인수로 사용하여 명령을 실행합니다. 거품을 내고 헹구고 여러 번 반복한 다음 Ctrl-D를 눌러 주기를 종료합니다 select
. 물론, 파일 이름에 대해 더 잘 알고 있다면 와일드카드를 강화할 수 있습니다.
사용하면 select
마우스를 사용한 복사/붙여넣기로 인해 위험할 수 있는 실수로 파일 이름이 확장되거나 분할되는 것을 방지할 수 있습니다. 전자의 경우 두 개의 파일이 포함된 디렉토리를 고려하십시오: ab
및 ab*
. 이 파일을 복사/붙여넣으면 ab*
얻을 수 있습니다.둘 다먼저 파일을 돌려 ab
받으세요! 후자의 경우 세 개의 파일 a
과 b
" a b
"이 포함된 디렉토리를 고려하십시오. ' ' 파일을 복사/붙여넣으려고 하면 a b
통과됩니다.다른파일 a
및 b
!
너무 많이 입력하는 것 같으면 "한 줄"로 변환할 수 있습니다.
select mine in *; do your-command "$mine"; done
답변3
Bash를 사용하는 경우 전화를 걸 수 있습니다 edit-and-execute-command
(맨페이지 참조). 그러면 bash는 사용자가 선택한 방식으로 현재 명령줄을 열게 됩니다 $VISUAL
. $EDITOR
그런 다음 편집기를 사용하여 ls의 출력을 얻을 수 있습니다.
이는 구성에 따라 크게 다르지만 C-xC-e
기본적으로 수행됩니다. bash를 vi 모드로 설정하면 esc v
이 작업이 수행됩니다 .
bash는 편집기를 저장하고 편집할 때 이 명령을 실행합니다.
다른 쉘에도 비슷한 기능이 있습니다.
답변4
경고하다
ls
이 답변은 출력이 권장되지 않는 파이프라인에 의존하기 때문에 예상치 못한 결과가 발생할 수 있습니다. 자세한 내용을 보려면 아래로 스크롤하여 라벨이 붙은 섹션을 확인하세요.편집 2.
명령 대체
명령 대체 $(command)
서브쉘을 생성하고 서브쉘에서 명령을 실행한 다음 서브쉘의 출력을 메인 쉘로 반환합니다.
구문은 다음과 같습니다.
main_command_to_run $(ls | grep 'name_of_file')
(적어도 나에게는) 일반적인 사용 사례는 tar.gz 파일의 압축을 풀 때입니다.
tar -xvzf $(ls | grep 'tar')
일부 컨텍스트 - 이 경우 현재 디렉터리에 tar 파일이 하나만 있다는 것을 알고 있으므로 tar.gz 파일의 전체 이름을 입력할 필요가 없습니다.
물론, ls | grep 'name_of_file'
파일 이름이 고유하다고 확신하지 않는 한, 하나의 결과만 나오는지 테스트하기 위해 먼저 실행하는 것이 가장 좋습니다.
편집 1
@roaima가 지적했듯이 파일 이름에 공백이 있으면 표현식에 큰따옴표를 추가해야 합니다.
main_command_to_run "$(ls | grep 'name_of_file')"
와일드카드(와일드카드) 사용
이 구문을 사용하는 대신 $(ls | grep 'name_of_file')
와일드카드를 사용하는 것입니다. 그 중 "?", "*", "[]" 및 기타 와일드카드 문자다른 사람문자를 일치시키는 데 사용됩니다.
0개 이상의 문자와 일치하는 와일드카드 문자인 별표('*')를 사용하는 예를 제공합니다. 따라서 @roaima가 친절하게 제공한 대로 "foo.tar.gz"라는 파일의 가능한 사용 사례는 다음과 같습니다.
tar -xvzf *.tar*
편집 2
ls
@Hermann도 지적했듯이 파이프 출력은 여러 가지 이유로 신뢰할 수 없습니다. 이유에 대한 설명은 아래 링크를 참조하세요.
링크 1
링크 2
링크 3
링크 4