공백이 포함된 파일 이름을 정렬하고 파일을 연결하는 방법은 무엇입니까?

공백이 포함된 파일 이름을 정렬하고 파일을 연결하는 방법은 무엇입니까?

공백이 포함된 파일 이름을 처리하는 데 문제가 있습니다. 파일 이름에 공백이 포함된 파일을 연결하고 싶습니다. 또한 파일 이름을 숫자별로 정렬하고 싶습니다. 분명히 다음은 실패합니다.

cat $(ls *.sql | sort -n)

이후는 foo bar.sql에 두 개의 인수로 전달됩니다 cat. 여기서 일반적인 접근 방식은 무엇입니까?

답변1

여기서는 필요하지 않습니다 ls. globs를 확장하여 디렉토리의 내용을 나열하는 쉘입니다 *.sql.

GNU 또는 FreeBSD 시스템의 경우:

printf '%s\0' *.sql | sort -nz | xargs -r0 cat --

( with \0대신 사용하면 개행 문자가 포함된 파일 이름에도 작동합니다).\n-z/-0

숫자 정렬에서는 -n숫자가 파일 이름의 시작 부분에 있다고 가정합니다.

또는 다음과 같은 경우 zsh:

cat ./*.sql(.n)

( glob 한정자는 숫자 정렬을 활성화하는 데 사용됩니다(모든 파일 이름에 동일한 접두어(예: , ) n가 있는 경우 숫자가 시작이 아닌 경우에도 작동합니다 . 또한 일반 파일만 포함하도록 추가했습니다. 파일을 숨기려면 다음을 추가하세요. 좋다 ).file12.sqlfile2.sql.D.foo.sql

답변2

cat $(ls -1)IFS를 다시 작성하면 이 작업을 수행할 수 있습니다. IFS는 구분 기호로 사용할 문자를 BASH에 알려주는 쉘 변수입니다. IFS의 기본값은 공백, 탭 및 줄 바꿈입니다. IFS를 개행으로 변경하면 이렇게 할 수 있습니다 cat $(ls -1).

다른 답변에는 아무런 문제가 없지만 일반적으로 공백을 처리하는 방법에 대한 더 직접적인 답변일 수 있으며 이 답변에서는 대부분의 사람들에게 익숙하지 않은 IFS 변수를 소개합니다.

#!/bin/bash
dir=$(mktemp -d)
for x in $(seq 10); do
    echo $x > "$dir/$(date) $x.txt"
done

pushd $dir
ls -1 $dir

# Set IFS to newline only inorder to deal with the spaces in the file names
#
oldIFS=$IFS
IFS=$'\n'


cat $(ls -1 $dir)


IFS=$oldIFS

산출

[sri@localhost test]$ ./test
/tmp/tmp.IuXCBzbTLj ~/test
Mon Nov 17 06:38:52 EST 2014 10.txt
Mon Nov 17 06:38:52 EST 2014 1.txt
Mon Nov 17 06:38:52 EST 2014 2.txt
Mon Nov 17 06:38:52 EST 2014 3.txt
Mon Nov 17 06:38:52 EST 2014 4.txt
Mon Nov 17 06:38:52 EST 2014 5.txt
Mon Nov 17 06:38:52 EST 2014 6.txt
Mon Nov 17 06:38:52 EST 2014 7.txt
Mon Nov 17 06:38:52 EST 2014 8.txt
Mon Nov 17 06:38:52 EST 2014 9.txt
10
1
2
3
4
5
6
7
8
9

다음은 IFS에 관한 일부 문서에 대한 링크입니다. http://bash.cyberciti.biz/guide/$IFS. 오래전에 O'Rielly의 BASH 책을 읽고 배운 것 같아요.

답변3

사용자 정의 구분 기호와 함께 사용 xargs(GNU 구현 가정)(파일 이름에 개행 문자가 포함되어 있지 않다고 가정):

ls -1d -- *.sql | sort -n | xargs -d "\n" cat --

관련 정보