특정 범위에서 번호가 매겨진 파일 목록 같이 번호가 매겨진 디렉토리에 파일 세트가 있습니다. file1.txt file2.txt … file30.txt … 이제

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

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.



답변

이 시도:

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


답변