Midnight Commander와 같은 파일 관리자를 사용하는 것이 좋은 기회일 수도 있지만, 셸에서 이 작업을 수행할 수 있는 우아한 방법이 있는지 알고 싶습니다.
한 디렉터리에서 다른 디렉터리로 파일을 복사하고 싶다고 가정해 보겠습니다. 디렉토리는 크고 파일 이름은 길고 복잡하며 부분적으로는 비밀스럽습니다. 정확한 이름은 모르겠지만 penguin
.
처음으로 검색해봄
find . -iname "*penguin*" | less
결과를 살펴보겠습니다.
./l1fe_of_Penguins ./Fw0rld_Of_penguins ./FUnNy_penguin
"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