합병증
다음은 때때로 작동합니다.
gzip -d `cat large_file_list`
세 가지 문제가 있습니다 ( bash
대부분의 Bourne과 같은 쉘에서).
파일 이름에 공백 탭이나 줄 바꿈 문자가있는 경우 실패합니다 ( $IFS
수정되지 않은 것으로 가정 ). 이것은 쉘의 단어 splitting 때문입니다 .
파일 이름에 glob-active 문자가 있으면 실패 할 수도 있습니다. 쉘이 파일 이름에 경로 이름 확장 을 적용하기 때문 입니다.
와 파일 이름 시작이 경우에도 실패합니다 -
(경우 POSIXLY_CORRECT=1
또는 경우에 그 첫 번째 파일에 적용) 모든 파일 이름입니다 -
.
하나의 명령 행에 맞지 않는 파일 이름이 너무 많으면 실패합니다.
아래 코드는 위 코드와 동일한 문제가 있습니다 (4 번째 제외).
for file in `cat large_file_list`
do
gzip -d $file
done
안정적인 솔루션
당신이 경우 large_file_list
줄에 정확히 하나의 파일 이름을 가지고 있으며,라는 파일이 -
그 (것)들의 사이에서하지 않고, 당신이 GNU 시스템에있어, 다음 사용
xargs -rd'\n' gzip -d -- <large_file_list
-d'\n'
xargs
각 입력 줄을 별도의 파일 이름으로 취급하도록 지시 합니다.
-r
xargs
입력 파일이 비어 있으면 명령을 실행하지 않도록 지시 합니다.
--
이야기 gzip
다음 인수들이 시작하는 경우에도 옵션으로 취급되지 않도록 -
. -
그래도 여전히 -
호출 된 파일 대신 처리됩니다 -
.
xargs
각 명령 줄에 많은 파일 이름을 넣지 만 명령 줄 제한을 초과하는 파일 이름은 없습니다. 이렇게하면 gzip
프로세스를 시작해야하는 횟수가 줄어들어 빠르게 진행됩니다. 파일 이름도 단어 분할 및 경로 이름 확장 으로부터 보호됩니다 .
gzip
시스템에서 시작하는 데 걸리는 시간 , 파일 목록의 파일 수 및 파일 크기에 따라 다릅니다.