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