PRC1772까지 PRC0001, PRC002라는 이름의 1772개 파일이 포함된 디렉토리가 있습니다.
하위 집합(예: PRC0257에서 PRC1516까지)을 다른 디렉터리에 복사하려면 어떻게 해야 합니까? 모든 그룹이 지정된 번호에서 시작하여 그룹의 마지막 항목까지 순차적으로 계속되지만 이러한 파일의 여러 그룹을 사용하여 이 작업을 수행하려고 합니다.
bash 쉘 스크립트와 매개변수.txt 파일을 사용하여 이 작업을 수행하려고 합니다...
답변1
가장 쉬운 방법은 zsh의 번호 범위를 사용하는 것입니다.전반적인 상황:
mv PRC<257-1516> /else/where/
범위 연산자는 앞에 0이 있거나 없는 숫자와 일치하므로 PRC257
, PRC0257
등 PRC00257
이 포함됩니다. 예를 들어 PRC<257->
257에서 시작하는 모든 파일을 이동하려면 범위 끝을 비워 둘 수 있습니다 . 해당 범위 내에 얼마나 많은 파일이 존재하는지는 중요하지 않습니다. 일반적인 쉘 중에서 zsh만이 이 기능을 가지고 있습니다.
Bash, ksh93 및 zsh는 중괄호로 범위를 지원합니다. 이는 전역 변수가 아니지만 간단한 텍스트 확장입니다. 예를 들어 이러한 파일의 존재 여부에 관계없이 a{9..11}
확장됩니다 .a9 a10 a11
mv PRC{0257..1516} /else/where
여러 glob을 결합할 수도 있습니다. 이는 모든 셸에서 작업할 수 있다는 이점이 있지만 경계가 정수가 아닌 경우 다루기 어렵습니다.
mv PRC025[7-9] PRC02[6-9][0-9] PRC0[3-9][0-9][0-9] PRC1[0-4][0-9][0-9] PRC150[0-9] PRC151[0-6] /else/where
또는 전역 및 필터에 더 포괄적일 수 있습니다.
for x in PRC[0-9]*; do
n=${x#PRC}
n=${x%"${x##*[!0]*}"} # strip leading zeroes (beware that numbers with a leading 0 are parsed in octal)
if [ "$x" -ge 257 ] && [ "$x" -le 1516 ]; then mv "#x" /else/where; fi
done
답변2
중괄호로 범위를 선택합니다.
cp PRC{0257..1516} destination/