cp -i에서 키 입력을 피할 수 있나요?

cp -i에서 키 입력을 피할 수 있나요?

나는 종종 유사한 방법을 사용하여 긴 파일 목록을 선택적으로 보관해야 하며 프로세스 속도를 높이려면 각 파일에서 키를 cp -iar누르는 대신 키만 누르기만 하면 됩니다 . 즉, 과 또는 를 누르지 않아도 되도록 하고 싶습니다 . 물론 대신 다른 키를 사용하면 좋을 것입니다 .ynENTERENTERynyn

이를 수행할 수 있는 방법이 있습니까?

답변1

제 생각에는 Midnight Commander와 같은 파일 관리자가 필요한 것 같습니다. mc에서는 insert또는 +를 사용하여 여러 파일을 선택하고 삭제, 이동 또는 복사할 수 있습니다. 전체 지침과 팁은 다음에서 확인할 수 있습니다.지도 시간.

file0~file10이 있지만 file1과 file3만 복사한다고 가정하고 순수 쉘 명령(GUI 없음)을 시도하는 경우:

cp file1 file3 directory/

물론 셸을 사용하여 스스로를 도울 수 있습니다.

cp file{1,3} directory/

하지만 연속적인 경우는 어떻습니까? 파일 5를 파일 10으로?

cp file{5..10} directory/

좀 더 고급 기능을 원한다면 find다음과 같이 도움을 줄 수도 있습니다.

find Downloads -name "*.cfg" -exec cp {} directory \;

할 것입니다 :

copy Downloads/file(6).cfg to directory
copy Downloads/file(7).cfg to directory
copy Downloads/file(1).cfg to directory
copy Downloads/file.cfg to directory
copy Downloads/file(2).cfg to directory
copy Downloads/file(4).cfg to directory
copy Downloads/file(3).cfg to directory
copy Downloads/file(5).cfg to directory

복사하려는 파일을 확인하고 해당 -exec ...부분을 삭제할 수 있습니다. -exec echo cp ...find가 무엇인지 궁금하다면 그것을 사용할 수도 있습니다.

답변2

예, 가능합니다. 하지만 조금 복잡합니다. 여기에서는 이 bash 스크립트를 가져와서 PATH에 넣을 이름의 파일
에 저장하고 분명히 몇 가지 개선이 필요하다는 점을 잊지 마십시오.mycp.shchmod +x mycp.

#!/bin/bash
[ $# -ne 2 ] && echo -en "ERROR : Need 2 parameters.\n" && exit
[ -f $1 ] && cp $1 $2
if [ -d $1 ]  
then
    mkdir -p $2
    cd $1
    find . | while read fn
    do
        if [ -f $fn ] 
        then
            read -r -n1 yesorno
            if [ "$yesorno" == "y" ] || [ "$yesorno" == "Y" ]  
            then 
                mkdir -p $2/`dirname $fn`
                cp $fn $2/`dirname $fn`
            fi
        fi
    done
fi

답변3

y이 경우 다음 에 를 누르지 않으려면 Enter이전 줄( 터미널 설정의 Ctrl++ ) + 개행 문자 Shift를 한 번 복사한 다음 메시지가 표시될 때 ( ++ ) 를 붙여넣습니다 .CyCtrlShiftV

버튼이 아니라 한 번에 누를 수 있는 버튼이고, 나에겐 그것만으로도 충분하다. 다음 프롬프트를 기다리는 동안 +를 누르고 있을 수 있습니다 Ctrl.Shift

답변4

Slyx 호출을 기반으로 한 read간단한 한 줄 코드는 다음과 같습니다.

{ while read -r -n1 i; do echo >&2; echo $i; done } | cp -iar …

Ctrl루프를 종료하려면 마지막에 +를 눌러야 합니다 . D지금까지 명령이 완료된 후 루프를 종료하는 마법적인 방법을 찾지 못했습니다. 트랩이 SIGCHLD원하는 방식으로 작동하지 않는 것 같습니다. path 에 라는 파일에 저장하면 yesorno다음과 같이 작성할 수 있습니다.

#!/bin/bash
{ while read -r -n1 i; do echo >&2; echo $i; done } | "$@"

대안으로 이를 함수로 정의할 수 있습니다 ~/.bash_profile.

yesorno() {
  { while read -r -n1 i; do echo >&2; echo $i; done } | "$@"
}

두 경우 모두 다음과 같이 호출할 수 있습니다.

yesorno cp -iar …

관련 정보