특정 범위에서 번호가 매겨진 파일 목록


16

다음과 같이 번호가 매겨진 디렉토리에 파일 세트가 있습니다.

file1.txt
file2.txt
...
file30.txt
...

이제 특정 파일 범위에서 명령을 실행하고 싶습니다 .18에서 31까지 말합니다.

지금까지 나는 다음과 같은 방법을 사용했습니다.

세 가지 주장

command file1[8-9].txt file2[0-9].txt file3[0-1].txt

이제 다른 모든 숫자를 원한다고 가정 해 봅시다.

고리

for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command

이것은보다 안정적인 루프 인 것처럼 보입니다 (공간 작동)

for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command

그러나이 작업을 수행하는 더 간단한 방법이 있어야합니다. 가장 좋은 해결책은 파일 세트를 명령 줄에 반환하는 bash 함수를 만드는 것입니다. 그런 다음에 다음과 같은 일을 할 수있었습니다.

command `filerange file 18 31`

이 작업을 효율적으로 수행하는 더 좋은 방법이나 제안이 있습니까?

웹이나 다른 곳에서이 같은 질문에 대한 답변을 놓친 경우 사전에 사과드립니다 superuser.


forxargs를 사용하여 파일 이름에 공백을 허용 하는 루프를 사용하는 솔루션을 포함하도록 질문을 업데이트했습니다 . bash 4가 없으면 작동하는 것 같습니다. bash 4가 있으면 괄호 확장을 사용하십시오! 선택한 답변을 참조하십시오. Snow Leopard bash를 업그레이드하기위한
수치

답변:


25

이 시도:

for file in file{18..31}.txt

"시퀀스 표현식"으로 알려져 있으며 Bash의 중괄호 확장 기능 의 일부입니다 . Bash 3과 4에서 작동합니다.

증가 기능은 Bash 4의 새로운 기능입니다. Bash 3.x가있을 수 있습니다.

Bash 4에서는 다음을 수행 할 수 있습니다.

$ for i in {1..6..2}; do echo $i; done
1
3
5

그러나 Bash 3에서는 동일한 결과를 얻으려면이 작업을 수행해야합니다.

$ for ((i=1; i<=6; i+=2)); do echo $i; done

1 씩 증가하는 동일한 양식 :

$ for ((i=1; i<=6; i++)); do echo $i; done

숫자는 변수 또는 표현식 일 수 있습니다. 그러나 시퀀스 표현식에서 숫자는 상수 여야합니다.

다음은 파일에서 해당 양식을 사용하는 예입니다.

for ((i=18; i<=31; i++))
do
    echo "file${i}.txt"
done

Bash 4에서 시퀀스 표현식의 또 다른 새로운 기능은 선행 0을 포함하는 기능입니다. 적절하게 정렬 할 수있는 번호가 매겨진 파일을 만들고 사용하려는 경우에 유용합니다.

배쉬 4에서 :

touch file{001..010}.txt

"file010.txt"를 통해 "file001.txt"라는 파일을 생성합니다. 그들의 이름은 예상 순서대로 정렬됩니다. 앞에 0이 없으면 "file10.txt"가 "file1.txt"보다 먼저 정렬됩니다.

파일로 작업하기 위해 동일한 선행 0 구문을 사용할 수 있습니다.

for file in file{001..010}.txt; do echo "$file"; done

Bash 3에서 선행 0이 필요한 경우 값을 직접 입력해야합니다.

for i in {1..10}
do
    printf -v i '%03d' $i 
    echo "file${i}.txt"
done

printf명령문은 i 값 앞에 0을 추가하여 너비가 3이되도록합니다 (예 : "4"는 "004"가 됨).

편집하다:

파일 이름에 공백을 넣는 것은 간단합니다.

$ touch "space name "{008..018..3}" more spaces"
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces
$ for f in "space name "{008..018..3}" more spaces"; do mv "$f" "${f}.txt"; done
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces.txt

감사합니다! 나는 이것이 내 평생 어디에 있었는지 모른다. 그래도 작동 할 수없는 한 가지는 OSX 버전의 bash에서 증가가 작동하지 않는 것입니다. 즉, {1..10..2}OSX bash에서 일할 수 없습니다 .
milkypostman

글쎄, 그것은 Snow Leopard가 어떤 이유로 bash 3.1을 사용하는 원인입니다. 이것은 소프트웨어 문제입니다.
milkypostman

@milkypostman : 증가 기능과 선행 0 {01..10}은 Bash 4의 새로운 기능 입니다. Bash 3.x가있을 수 있습니다. 증분 기능이 필요하거나 범위 경계에 변수를 사용하려면이 형식을 사용하십시오 for ((i=1; i<=10; i+=2}(또는 i++1 씩 증가). 숫자는 변수 또는 표현식 일 수 있습니다. 그런 다음 for루프 내부의 값을 사용하려면 echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do: printf -vi '% 03d'$ i`를 사용합니다. 앞에 i0이 붙는 값이 앞에옵니다. 따라서 너비는 3입니다 (예 : "4"는 "004"가 됨).
추후 공지가있을 때까지 일시 중지되었습니다.

Dennis, 대체 양식을 포함하도록 솔루션을 업데이트 할 수있는 방법이 있습니까? 의견이기 때문에 아마 내가 얻을 것으로 예상되는 것을 모호하게 만듭니다.
milkypostman

@milkypostman : 편집 한 답변보기.
추후 공지가있을 때까지 일시 중지되었습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.