파일을 구문 분석할 때 쓸데없는 cat 사용을 방지하는 방법은 무엇입니까?

파일을 구문 분석할 때 쓸데없는 cat 사용을 방지하는 방법은 무엇입니까?

디렉토리 목록이 포함된 파일이 있습니다. 예를 들어

/foo/bar/dir1
/foo/bar/dir2
/foo/bar/dir3

나는 이 모든 디렉토리를 만들고 싶습니다. 이것이 내가 한 일입니다:

for dir in $(cat myfile); do mkdir $dir; done

"고양이의 쓸데없는 이용"을 피하면서 해야 할 올바른 일은 무엇입니까?

이상적으로 대답은 Ksh88에 초점을 맞추지만 다른 쉘에도 관심이 있습니다.

답변1

일반적으로 프로그래머의 사용 조언이 xargs가장 좋지만 또 다른 옵션은 루프로의 리디렉션을 사용하는 것입니다 while. 이를 통해 추가 명령을 실행하고 변수를 설정할 수 있습니다.

while read -r dir; do mkdir $dir; done < myfile

더 복잡한 구조의 예는 다음과 같습니다.

now=`date +%Y%m%d.%H%M%S`
while read -r dir; do
    newdistfile="/tmp/dist-`echo $dir | tr / _`.tgz"
    mv $dir ~/backups/$dir.$now &&
        mkdir $dir &&
        tar xzfC $newdistfile $dir
done < myfile

xargs이는 "도우미 프로그램"을 작성하지 않고는 수행할 수 없습니다.

답변2

나는 다음과 같은 것을 할 것입니다

xargs mkdir < myfile

답변3

적어도 bash에서는 파일 이름에 공백과 개행 문자가 포함되지 않는 한 다음과 같은 일이 발생합니다.

mkdir $(< myfile) 

일하다. 그래서 우리가 그것을 사용하는 것 역시 쓸모가 없습니다 for.xargs

< 와 비교하여 bash에서 새 프로세스를 시작하지 cat않습니다 ksh.

답변4

나는 이것이 고양이의 쓸모없는 사용이라고 말하고 싶지 않습니다.

내부에클래식한 감각, UUOC는 다음과 같이 쓰는 것을 의미합니다.

cat file | some_command and its args ...

비슷하고 저렴하기보다는

<file some_command and its args ...

또는 (동일하고 더 고전적으로)

some_command and its args ... < file

이 경우:

for dir in $(cat myfile); do mkdir $dir; done

cat출력을 파이프하는 명령이 없습니다 .

물론 를 사용하지 않는 대안도 있습니다 cat. 특히 bash 및 ksh의 경우 모든 쉘이 이 구성을 지원하는 것은 아니지만 $(<myfile)더 빠를 수 있습니다 . $(cat myfile)그러나 나는 AProgrammer의 솔루션을 "useless xargs"라고 부르는 것보다 더 이상 원래 코드를 "useless cat"이라고 부르지 않을 것입니다.

관련 정보