추가 처리를 위해 파일 "선택"

추가 처리를 위해 파일 "선택"

Midnight Commander와 같은 파일 관리자를 사용하는 것이 좋은 기회일 수도 있지만, 셸에서 이 작업을 수행할 수 있는 우아한 방법이 있는지 알고 싶습니다.

한 디렉터리에서 다른 디렉터리로 파일을 복사하고 싶다고 가정해 보겠습니다. 디렉토리는 크고 파일 이름은 길고 복잡하며 부분적으로는 비밀스럽습니다. 정확한 이름은 모르겠지만 penguin.

  1. 처음으로 검색해봄find . -iname "*penguin*" | less

  2. 결과를 살펴보겠습니다.

    ./l1fe_of_Penguins
    ./Fw0rld_Of_penguins
    ./FUnNy_penguin
    
  3. "Funny Penguin" 파일을 복사하고 싶습니다. 그런 다음 복잡한 파일 이름의 일부 관련 부분을 기억하고 이를 쉘 명령에 입력했습니다.

    cp FUn*penguin /media/share
    

어떻게 하면 더 빠르게 할 수 있나요? 전체 텍스트 모드에서 검색 결과의 명령줄 인수로 파일 이름을 얻는 방법은 무엇입니까?

답변1

Tab 키를 사용하여 대부분의 쉘에 대한 파일 시스템 경로를 자동 완성할 수 있습니다.

bash는 이것과 그 이상을 지원합니다.

그러나 내가 접한 가장 상호작용적인 쉘은 zsh인데, 여기에는 사용자 정의 구성 파일이 있습니다.grml의 zsh 구성그리고아 맙소사.

zsh를 사용하면 자동 완성을 위해 glob을 사용할 수 있으며 한 번에 여러 파일을 완성할 수도 있습니다.

어떤 유형의 Unix나 Linux를 사용하고 있는지 모르더라도 제가 말씀드릴 수 있는 최선은 소프트웨어 저장소를 확인하거나 직접 zsh를 컴파일하는 것입니다.

Penguin에 대해 언급했으므로 Linux를 사용한다고 가정하고 패키지 관리자에게 다음 사항을 확인하세요.

zsh

고급 rc 파일의 경우 셸에서 많은 멋진 기능을 지원할 수 있습니다.

grml-zsh-config
oh-my-zsh

답변2

나는 이것을 할 수 있는 방법을 찾았습니다:

find . -iname "*penguin*" | pick | xargs -J % cp -i % /media/share

답변3

-exec옵션을 사용하면 find다음과 같은 명령을 실행할 수도 있습니다.

find . -iname "*penguin*" -exec cp {} /media/share \;

이는 {}이름으로 대체됩니다.

그런데. man find중대하다! :)

답변4

이것을 시도해 볼 수 있습니다.

출력에 만족하면 echo 명령을 제거하십시오.

find . -iname "*penguin*" | awk '/penguin$/' | while read filename
do
    echo "cp ${filename} /media/share"
done

관련 정보