나는 종종 유사한 방법을 사용하여 긴 파일 목록을 선택적으로 보관해야 하며 프로세스 속도를 높이려면 각 파일에서 키를 cp -iar
누르는 대신 키만 누르기만 하면 됩니다 . 즉, 과 또는 를 누르지 않아도 되도록 하고 싶습니다 . 물론 대신 다른 키를 사용하면 좋을 것입니다 .y
n
ENTER
ENTER
y
n
y
n
이를 수행할 수 있는 방법이 있습니까?
답변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.sh
chmod +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를 한 번 복사한 다음 메시지가 표시될 때 ( ++ ) 를 붙여넣습니다 .Cy
CtrlShiftV
버튼이 아니라 한 번에 누를 수 있는 버튼이고, 나에겐 그것만으로도 충분하다. 다음 프롬프트를 기다리는 동안 +를 누르고 있을 수 있습니다 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 …