
디렉토리에는 특정 수의 파일이 있습니다. 이는 53개의 txt 파일일 수 있지만 123개의 파일도 있을 수 있습니다. 파일에는 다양한 임의의 이름이 있지만 모두 파일 핸들이 있습니다..txt
ls를 사용하여 모든 파일 목록을 가져와 이를 변수에 넣을 수 있습니다.
list_of_txt_files=$(ls *.txt)
하지만 목록을 여러 개별 목록으로 분할하고 싶습니다. 각 목록에는 10개의 요소만 있습니다. 즉, 53개의 txt 파일이 있는 폴더에는 6개의 목록이 제공되어야 합니다. 10개의 파일 이름이 있는 5개 목록과 3개의 파일 이름이 있는 6번째 목록입니다. 디렉토리에 123개의 txt 파일이 있는 예에서는 10개의 파일 이름이 있는 12개의 목록과 3개의 파일 이름만 있는 13번째 목록이 제공됩니다. .
53개의 txt 파일을 사용한 예에서는 list no. 1은 10번째 파일까지 첫 번째 파일을 보관하고 목록 번호는 1번입니다. 2는 11번째 파일부터 20번째 파일까지 보관하는 식입니다. 나는 다른 사람들이 목록을 다르게 분류하고 싶어할 수도 있다고 생각하여 목록의 i번째부터 j번째 요소까지 내 질문의 제목을 지정했습니다. 아마도 디렉토리의 첫 번째 파일부터 100번째 파일까지일 것입니다.
궁극적인 목표는 for do 루프에서 이러한 목록을 사용하고 cat 명령을 사용하여 목록당 10개의 파일 내용을 10개 파일 세트당 하나의 파일에 기록하는 것입니다. 디렉토리가 있으면 6개의 파일이 제공됩니다. 처음 5개 파일에는 50개의 원본 txt 파일 내용이 포함되어 있고, 6번째 파일에는 마지막 나머지 3개 txt 파일 내용이 포함되어 있습니다.
head 또는 tail 명령 사용을 고려했지만 이 두 명령에 대한 범위를 지정하는 방법을 잘 모르겠습니다.
답변1
껍질에배열, 그것을 써. Bash로 말해보세요:
$ touch {01..53}
$ files=(*)
$ echo "${files[@]:0:10}"
01 02 03 04 05 06 07 08 09 10
$ for ((i = 0 ; i < ${#files[@]} ; i += 10 )) ; do
echo "${files[@]:i:10}" ;
# or
# cat "${files[@]:i:10}" > set-$(( i / 10 ))
done
01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53
그만큼하위 문자열 확장(배열 슬라이스)는 "${files[@]:i:10}"
단일 문자열이 아닌 단어 목록으로 확장되므로 반복할 수 있습니다.
for f in "${files[@]:i:10}" ; do
somecmd "$f"
done
하지 않다do files=$(ls *.txt)
는 ls
완전히 중복됩니다. 어쨌든 와일드카드를 평가하는 쉘입니다. 일반적으로 와일드카드 패턴을 변수( pat=*.txt
)에 저장하고 필요한 경우 이를 사용하거나(따옴표 제외), 실제 파일 이름으로 확장하려면 echo *.txt
대신에 를 사용합니다 ls
. 파일 이름 목록을 처리하려면 일반 POSIX 셸로 제한되지 않으면 배열이 더 좋습니다.
head
and 를 사용하여 목록을 분할하려면 11~20행을 가져오는 것과 tail
같은 작업을 수행해야 합니다 . 또는 sed: 를 사용하세요 .| head -20 | tail -10
| sed -n 11,20p
답변2
Bourne과 유사한 쉘(그러나 위치 요소에 액세스할 수 없는 Bourne 쉘 $9
)을 사용하면 다음을 수행할 수 있습니다.
set -- *.txt
while [ "$#" -gt 0 ]; do
something with "$1" ${2+"$2"} ${3+"$3"}... ${10+"${10}"}
[ "$#" -gt 10 ] || break
shift 10
done
xargs
프로세스 대체를 지원하는 GNU 및 쉘 사용 :
xargs -n10 -r0a <(printf '%s\0' *.txt) something with
와 함께 zsh
:
files=(*.txt(N))
while (($#files)) {
something with $files[1,10]
files[1,10]=()
}
또는:
autoload -U zargs
xargs -l10 -- *.txt -- something with
zsh
또한 의 glob 에서 범위를 사용할 수 있습니다 .
something with *.txt([1,10])