디렉토리 목록이 포함된 파일이 있습니다. 예를 들어
/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"이라고 부르지 않을 것입니다.