file01.txt, file02.txt… file85.txt와 같은 파일 범위를 'rm'또는 'mv'하는 방법


23

이런 식으로 명명 된 파일이 많이 있다고 가정 해보십시오.

file01.txt file02.txt file03.txt ... file20.txt

이 파일들의 범위에서 명령을 실행하고 싶습니다.

'file05.txt'에서 'file09.txt'로 'rm'을 원하면 할 수 있습니다.

rm file0[5-9].txt

그러나 어떻게 file08.txt에서 file13.txt까지의 범위를 'rm'할 수 있습니까? 나는이 코드를 시도

rm file[08-13].txt

작동하지 않습니다. 이 명령을 실행할 수 있습니다.

rm file0[89].txt file1[0-3].txt

그러나 가능하다면 'rm'에 대한 하나의 더 세련된 인수 로이 작업을 수행 할 수 있는지 알고 싶습니다.


거의 동일한 질문은 여기에 대답했다 : stackoverflow.com/questions/25049411/...
arielf

답변:


38

다음 중괄호 확장을 사용해야합니다 bash.

rm file{08..13}.txt

이 파일 file08을 제거하고 file13누락 된 파일이 있으면 오류 메시지를 표시합니다.

필요에 따라 범위를 설정하십시오.


globbing 연산자의 문제점 []은 내부의 각 문자 / 숫자를 단일 토큰으로 취급하므로 단일 숫자를 사용하여 범위 선언 만 지원한다는 것입니다.

를 사용한다고 주장 []하면이 추악한 패턴을 사용 file08하여 file13다음 과 일치 시킬 수 있습니다 .

rm file0[8-9].txt file1[0-3].txt

5
중괄호 확장을위한처럼, 또한 쉼표로 유용 mv foo.{txt,md}또는cp foo.txt{,.bak}
코스

2

Ubuntu의 기본값 /bin/sh( dash) 또는 mksh중괄호 확장이 없거나 중괄호 확장 의 경우와 같이 일부 쉘 은 ksh채워진 0을 사용할 수 없습니다.

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

이러한 경우에, 우리는 사용하실 수 있습니다 printf파일 이름의 숫자 부분을 포맷하고, 루프는 루프 동작에 대한 C-처럼 구현하는 동안 (메모를 대체 할를 사용 echo하여 rm당신이 원하는 또는) :

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

그리고 이것은 매우 휴대용 - 작동 dash, ksh,가 mksh,도 bash. 의 경우 kshbash우리는 또한 사용할 수 있습니다 c-style for loop syntax (but not in case ofmksh or) dash`를 :

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

주에 있음을 bash의 경우, printf지원이 변수로 인쇄, 따라서 우리가 할 수있는 printf -v num "%.2d" "$i"대신에 명령 치환을 사용.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.