![파일을 구문 분석할 때 쓸데없는 cat 사용을 방지하는 방법은 무엇입니까?](https://linux55.com/image/19748/%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D%ED%95%A0%20%EB%95%8C%20%EC%93%B8%EB%8D%B0%EC%97%86%EB%8A%94%20cat%20%EC%82%AC%EC%9A%A9%EC%9D%84%20%EB%B0%A9%EC%A7%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
디렉토리 목록이 포함된 파일이 있습니다. 예를 들어
/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"이라고 부르지 않을 것입니다.