12.2. º¹ÀâÇÑ ¸í·É¾î

¸í·É¾î ¸ñ·Ï

find

-exec COMMAND \;

find°¡ ã¾Æ³½ °¢°¢ÀÇ ÆÄÀÏ¿¡ ´ëÇØ COMMAND¸¦ ½ÇÇàÇÕ´Ï´Ù. COMMAND´Â \;À¸·Î ³¡³ª¾ß ÇÕ´Ï´Ù(find·Î ³Ñ¾î°¡´Â ¸í·É¾îÀÇ ³¡À» ³ªÅ¸³»´Â ;¸¦ ½©ÀÌ Çؼ®ÇÏÁö ¾Êµµ·Ï À̽ºÄÉÀÌÇÁ ½ÃÄÑ¾ß ÇÕ´Ï´Ù). COMMAND¿¡ {}ÀÌ Æ÷ÇԵǾî ÀÖÀ¸¸é ¼±ÅÃµÈ ÆÄÀÏÀ» ¿ÏÀüÇÑ °æ·Î¸íÀ¸·Î ¹Ù²ã ÁÝ´Ï´Ù.

bash$ find ~/ -name '*.txt'
/home/bozo/.kde/share/apps/karm/karmdata.txt
/home/bozo/misc/irmeyc.txt
/home/bozo/test-scripts/1.txt
	      

find /home/bozo/projects -mtime 1
# /home/bozo/projects µð·ºÅ丮¾È¿¡ ÀÖ´Â ÆÄÀÏÁß¿¡¼­ 
# ÇÏ·ç Àü¿¡ º¯°æµÈ ÆÄÀϵéÀ» ¸ðµÎ º¸¿© ÁÝ´Ï´Ù.

find /etc -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \;

# /etc µð·ºÅ丮¿¡ µé¾î ÀÖ´Â ÆÄÀϵ鿡 Æ÷ÇÔµÈ 
# ¸ðµç IP ÁÖ¼Ò(xxx.xxx.xxx.xxx)¸¦ ã¾ÆÁÝ´Ï´Ù.
# IP °¡ ¾Æ´Ñ °Íµµ ³ª¿À´Âµ¥ À̰͵éÀ» ¾î¶»°Ô °É·¯³¾ ¼ö ÀÖÀ»±î¿ä?

# ÀÌ°Ç ¾î¶§¿ä?

find /etc -type f -exec cat '{}' \; | tr -c '.[:digit:]' '\n' \
 | grep '^[^.][^.]*\.[^.][^.]*\.[^.][^.]*\.[^.][^.]*$'

# Thanks, S.C. 

°æ°í

find¿¡¼­ ¾²ÀÌ´Â -exec ¿É¼ÇÀ» ½© ³»Àå ¸í·ÉÀÎ exec°ú Çò°¥¸®¸é ¾È µË´Ï´Ù.

¿¹ 12-2. Badname, ÆÄÀÏ À̸§¿¡ ÀϹÝÀûÀÌÁö ¾ÊÀº ¹®ÀÚ³ª °ø¹é ¹®ÀÚ¸¦ Æ÷ÇÔÇÏ´Â ÆÄÀÏÀ» Áö¿ì±â.

#!/bin/bash

# ÇöÀç µð·ºÅ丮¿¡ µé¾î ÀÖ´Â ÆÄÀÏÁß, À̸§¿¡ Á¤»óÀûÀÌÁö ¾ÊÀº ±ÛÀÚ°¡ Æ÷ÇÔµÈ ÆÄÀÏÀ» Áö¿ì±â

for filename in *
do
badname=`echo "$filename" | sed -n /[\+\{\;\"\\\=\?~\(\)\<\>\&\*\|\$]/p`
# ÀÌ·± °í¾àÇÑ ±ÛÀÚ¸¦ Æ÷ÇÔÇÏ´Â ÆÄÀϵé: + { ; " \ = ? ~ ( ) < > & * | $
rm $badname 2>/dev/null    # ¿¡·¯ ¸Þ¼¼Áö´Â ¹«½Ã.
done

# ´ÙÀ½Àº ¸ðµç Á¾·ùÀÇ °ø¹é ¹®ÀÚ¸¦ Æ÷ÇÔÇÏ´Â ÆÄÀϵéÀ» ó¸®ÇÏ°Ú½À´Ï´Ù.
find . -name "* *" -exec rm -f {} \;
# "find"°¡ ãÀº ÆÄÀÏÀ̸§ÀÌ "{}"·Î ¹Ù²ò´Ï´Ù.
# '\'¸¦ ½á¼­ ';'°¡ ¸í·É¾î ³¡À» ³ªÅ¸³½´Ù´Â ¿ø·¡ÀÇ Àǹ̷ΠÇؼ®µÇ°Ô ÇÕ´Ï´Ù.

exit 0

#---------------------------------------------------------------------
# ´ÙÀ½ÀÇ ¸í·É¾îµéÀº À§¿¡¼­ "exit"¸¦ Ç߱⠶§¹®¿¡ ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù.

# À§ ½ºÅ©¸³Æ®ÀÇ ´Ù¸¥ ¹æ¹ý:
find . -name '*[+{;"\\=?~()<>&*|$ ]*' -exec rm -f '{}' \;
exit 0
# (Thanks, S.C.)

¿¹ 12-3. inode ·Î ÆÄÀÏÀ» Áö¿ì±â

#!/bin/bash
# idelete.sh: inode ·Î ÆÄÀÏÀ» Áö¿ì±â.

#  ÀÌ ½ºÅ©¸³Æ®´Â ÆÄÀÏÀ̸§ÀÌ ? ³ª - ó·³ ºÎÀûÀýÇÑ ¹®ÀÚ·Î ½ÃÀÛµÉ ¶§ À¯¿ëÇÕ´Ï´Ù.

ARGCOUNT=1                      # ÀÎÀÚ·Î ÆÄÀÏÀ̸§ÀÌ ÇÊ¿äÇÔ.
E_WRONGARGS=70
E_FILE_NOT_EXIST=71
E_CHANGED_MIND=72

if [ $# -ne "$ARGCOUNT" ]
then
  echo "»ç¿ë¹ý: `basename $0` filename"
  exit $E_WRONGARGS
fi  

if [ ! -e "$1" ]
then
  echo "\""$1"\" ´Â Á¸ÀçÇÏÁö ¾Ê´Â ÆÄÀÏÀÔ´Ï´Ù."
  exit $E_FILE_NOT_EXIST
fi  

inum=`ls -i | grep "$1" | awk '{print $1}'`
# inum = ÆÄÀÏÀÇ inode (index node)
# ¸ðµç ÆÄÀÏÀº ÀÚ½ÅÀÇ ¹°¸®Àû ÁÖ¼Ò Á¤º¸¸¦ ´ã°í ÀÖ´Â inode¸¦ °®°í ÀÖ½À´Ï´Ù.

echo; echo -n "\"$1\" ¸¦ ÁøÂ¥·Î Áö¿ì½Ç °Ì´Ï±î(y/n)? "
read answer
case "$answer" in
[nN]) echo "¸¶À½À» ¹Ù²å±º¿ä, ±×·¸ÁÒ?"
      exit $E_CHANGED_MIND
      ;;
*)    echo "\"$1\" ¸¦ Áö¿ì´Â Áß.";;
esac

find . -inum $inum -exec rm {} \;
echo ""\"$1"\" °¡ Áö¿öÁ³½À´Ï´Ù!"

exit 0

½ºÅ©¸³Æ®¿¡¼­ find¸¦ »ç¿ëÇÏ´Â ´ÙÀ½ ¿¹Á¦µéÀ» Âü°íÇϼ¼¿ä. ¿¹ 12-22, ¿¹ 4-3, ¿¹ 10-8. ÀÌ º¹ÀâÇÏ°í °­·ÂÇÑ ¸í·É¾î¿¡ ´ëÇؼ­ ´õ ¾Ë°í ½ÍÀ¸¸é ¸ÇÆäÀÌÁö¸¦ »ìÆ캸¼¼¿ä.

xargs

¸í·É¾î¿¡ ÀÎÀÚµéÀ» ÇÊÅ͸µÇؼ­ ³Ñ°Ü ÁÖ°í ±× ¸í·É¾î¸¦ ´Ù½Ã Á¶ÇÕÇÏ´Â µ¥ ¾µ ¼öµµ ÀÖ½À´Ï´Ù. xargs´Â ÀÔ·ÂÀ» ÇÊÅÍ¿ëÀ¸·Î ÀÛ°Ô Á¶°¢³»¼­ ¸í·É¾î°¡ ó¸®ÇÏ°Ô ÇØ ÁÝ´Ï´Ù. ¿ªµû¿ÈÇ¥ÀÇ °­·ÂÇÑ ´ë¿ëÇ°À̶ó°í »ý°¢ÇÏ¸é µË´Ï´Ù. ¿ªµû¿ÈÇ¥¸¦ ½á¼­ too many arguments¶õ ¿¡·¯°¡ ³µÀ» ¶§, xargs·Î ¹Ù²ã ¾²¸é ¼º°øÇÒ ¼öµµ ÀÖ½À´Ï´Ù. º¸ÅëÀº Ç¥ÁØ ÀÔ·ÂÀ̳ª ÆÄÀÌÇÁ¿¡¼­ µ¥ÀÌÅ͸¦ ÀÐ¾î µéÀÌÁö¸¸ ÆÄÀÏÀÇ Ãâ·Â¿¡¼­µµ ÀÐÀ» ¼ö ÀÖ½À´Ï´Ù.

xargsÀÇ ±âº» ¸í·É¾î´Â echoÀÔ´Ï´Ù.

ls | xargs -p -l gzip Àº ÇöÀç µð·ºÅ丮ÀÇ ¸ðµç ÆÄÀÏ¿¡ ´ëÇØ Çѹø¿¡ ÇÑ ÆÄÀϾ¿ ¹°¾îº¸¸é¼­ gzipsÀ¸·Î ¹­¾îÁÝ´Ï´Ù.

ÀÛÀº Á¤º¸: Àç¹Õ´Â ¿É¼ÇÁß ÇϳªÀÎ -n XXÀ» ¾²¸é ³Ñ±æ ÀÎÀÚÀÇ °¹¼ö¸¦ XX·Î Á¦ÇÑÇÕ´Ï´Ù.

ls | xargs -n 8 echo ´Â ÇöÀç µð·ºÅ丮ÀÇ ÆÄÀϵéÀ» ÇÑ ÁÙ¿¡ 8 °³¾¿ ²÷¾î¼­ º¸¿©ÁÝ´Ï´Ù.

ÀÛÀº Á¤º¸: ´Ù¸¥ À¯¿ëÇÑ ¿É¼ÇÀ¸·Î find -print0³ª grep -lZ¿Í ÇÔ²² ¾²´Â -0ÀÌ ÀÖ½À´Ï´Ù. ÀÌ ¿É¼ÇÀº °ø¹é ¹®ÀÚ³ª µû¿ÈÇ¥°¡ µé¾î°£ ÀÎÀÚ¸¦ ó¸®ÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù.

find / -type f -print0 | xargs -0 grep -liwZ GUI | xargs -0 rm -f

grep -rliwZ GUI / | xargs -0 rm -f

À§ÀÇ µÎ °¡Áö ¸ðµÎ "GUI"¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ¾î¶² ÆÄÀϵµ Áö¿ö ÁÝ´Ï´Ù. (Thanks, S.C.)

¿¹ 12-4. ½Ã½ºÅÛ ·Î±× ¸ð´ÏÅ͸µ¿ë xargs ·Î±× ÆÄÀÏ

#!/bin/bash

# ÇöÀç µð·ºÅ丮¿¡ /var/log/messages ÀÇ ³¡ ºÎºÐÀ» Æ÷ÇÔÇÏ´Â ·Î±× ÆÄÀÏÀ» ¸¸µé±â

# ÁÖÀÇ: ÀÏ¹Ý »ç¿ëÀÚµµ ÀÌ ½ºÅ©¸³Æ®¸¦ ¾²°Ô ÇÏ·Á¸é 
#       ·çÆ®·Î chmod 644 /var/log/messages ¶ó°í Çؼ­
#       ´©±¸³ª /var/log/messages ¸¦ ÀÐÀ» ¼ö ÀÖ°Ô ÇØ¾ß µË´Ï´Ù.

LINES=5

( date; uname -a ) >>logfile
# ½Ã°£°ú ¸Ó½Å À̸§
echo --------------------------------------------------------------------- >>logfile
tail -$LINES /var/log/messages | xargs |  fmt -s >>logfile
echo >>logfile
echo >>logfile

exit 0

¿¹ 12-5. copydir. xargs·Î ÇöÀç µð·ºÅ丮¸¦ ´Ù¸¥ °÷À¸·Î º¹»çÇϱâ

#!/bin/bash

# ÇöÀç µð·ºÅ丮ÀÇ ¸ðµç ÆÄÀÏÀ»
# ¸í·É¾îÁÙ¿¡¼­ ÁöÁ¤ÇÑ µð·ºÅ丮·Î º¹»çÇϱâ(verbose).

if [ -z "$1" ]   # ÀÎÀÚ°¡ ¾ø´Ù¸é Á¾·á.
then
  echo "»ç¿ë¹ý: `basename $0` directory-to-copy-to"
  exit 65
fi  

ls . | xargs -i -t cp ./{} $1
# ¾î¶² ÆÄÀÏÀ̸§¿¡µµ "°ø¹é¹®ÀÚ"°¡ µé¾î ÀÖÁö ¾Ê´Ù¸é
#    cp * $1 
# À̶ó°í Çصµ µ¿ÀÏÇÕ´Ï´Ù.

exit 0
expr

´Ù¸ñÀû Ç¥Çö½Ä Æò°¡ ¸í·É¾î: ÁÖ¾îÁø ¿¬»ê¿¡ µû¶ó ÀÚµ¿À¸·Î °è»êÇϰųª Æò°¡ÇÕ´Ï´Ù. ÀÌ ¶§, ÀÎÀÚ´Â ºóÄ­À¸·Î ºÐ¸®µÇ¾î¾ß ÇÕ´Ï´Ù. »ê¼ú, ºñ±³, ¹®ÀÚ¿­, ³í¸® ¿¬»êµîÀÌ °¡´ÉÇÕ´Ï´Ù.

expr 3 + 5

8 ¸®ÅÏ

expr 5 % 3

2 ¸®ÅÏ

y=`expr $y + 1`

º¯¼ö¸¦ Áõ°¡. let y=y+1 À̳ª y=$(($y+1)) °ú °°À½. ÀÌ°ÍÀº »ê¼ú È®Àå ¿¹Á¦ÀÔ´Ï´Ù.

z=`expr substr $string $position $length`

$stringÀÇ $position¿¡¼­ºÎÅÍ $length¸¸Å­ÀÇ ¹®ÀÚ¿­Á¶°¢(substring)À» ÃßÃâÇØ ³¿.

¿¹ 12-6. expr ¾²±â

#!/bin/bash

# 'expr'ÀÇ ¸î°¡Áö »ç¿ë¹ý º¸¿©ÁÖ±â
# ===============================

echo

# »ê¼ú ¿¬»êÀÚ
# ---- ------

echo "»ê¼ú ¿¬»êÀÚ"
echo
a=`expr 5 + 3`
echo "5 + 3 = $a"

a=`expr $a + 1`
echo
echo "a + 1 = $a"
echo "(º¯¼ö Áõ°¡)"

a=`expr 5 % 3`
# ³ª¸ÓÁö(modulo)
echo
echo "5 mod 3 = $a"

echo
echo

# ³í¸® ¿¬»êÀÚ
# ---- ------

#  ÂüÀ̸é 1, °ÅÁþÀ̸é 0 ¸®ÅÏ.
#  Bash °ü·Ê¿Í ¹Ý´ëÀÔ´Ï´Ù.

echo "³í¸® ¿¬»êÀÚ"
echo

x=24
y=25
b=`expr $x = $y`         # °°Àº °ªÀÎÁö È®ÀÎÇϱâ.
echo "b = $b"            # 0  ( $x -ne $y )
echo

a=3
b=`expr $a \> 10`
echo 'b=`expr $a \> 10`, Áï...'
echo "If a > 10, b = 0 (°ÅÁþ)"
echo "b = $b"            # 0  ( 3 ! -gt 10 )
echo

b=`expr $a \< 10`
echo "If a < 10, b = 1 (Âü)"
echo "b = $b"            # 1  ( 3 -lt 10 )
echo
# ¿¬»êÀÚ¸¦ À̽ºÄÉÀÌÇÁ ½ÃŲ°Í¿¡ ÁÖÀÇ.

b=`expr $a \<= 3`
echo "If a <= 3, b = 1 (Âü)"
echo "b = $b"            # 1  ( 3 -le 3 )
# "\>=" ¿¬»êÀÚµµ ÀÖ¾î¿ä(Å©°Å³ª °°À½).


echo
echo

# ºñ±³ ¿¬»êÀÚ
# ---- ------

echo "ºñ±³ ¿¬»êÀÚ"
echo
a=zipper
echo "a ´Â $a"
if [ `expr $a = snap` ]
# º¯¼ö 'a'¸¦ °­Á¦·Î ÀçÆò°¡(re-evaluation)
then
   echo "a ´Â zipper °¡ ¾Æ´Ô"
fi   

echo
echo



# ¹®ÀÚ¿­ ¿¬»êÀÚ
# ------ ------

echo "¹®ÀÚ¿­ ¿¬»êÀÚ"
echo

a=1234zipper43231
echo "\"$a\" ¸¦ °¡Áö°í Á¶ÀÛÇØ º¸°Ú½À´Ï´Ù."

# length: ¹®ÀÚ¿­ ±æÀÌ
b=`expr length $a`
echo "\"$a\" ÀÇ ±æÀÌ´Â $b."

# index: ¹®ÀÚ¿­¿¡¼­ ¹®ÀÚ¿­Á¶°¢(substring)ÀÌ ÀÏÄ¡Çϴ ù¹ø° ¹®ÀÚÀÇ À§Ä¡
b=`expr index $a 23`
echo "\"$a\" ¿¡¼­ \"2\" °¡ ù¹ø°·Î ³ª¿À´Â À§Ä¡´Â \"$b\" ÀÔ´Ï´Ù."

# substr: ¹®ÀÚ¿­Á¶°¢ ÃßÃâ, ÃßÃâÇÒ ½ÃÀÛ À§Ä¡¿Í ÃßÃâÇÒ ±æÀÌ ÁöÁ¤
b=`expr substr $a 2 6`
echo "½ÃÀÛÀ§Ä¡´Â 2ÀÌ°í ±æÀÌ°¡ 6ÀÎ \"$a\" ÀÇ ¹®ÀÚ¿­Á¶°¢Àº \"$b\" ÀÔ´Ï´Ù."


# 'match' ¿¬»êÀº Á¤±ÔÇ¥Çö½ÄÀ» ¾²´Â 'grep'°ú ºñ½ÁÇÕ´Ï´Ù.
b=`expr match "$a" '[0-9]*'`
echo \"$a\" ¿¡¼­ ¾ÕÂÊ¿¡ ³ª¿À´Â ¼ýÀÚÀÇ °¹¼ö´Â $b ÀÔ´Ï´Ù.
b=`expr match "$a" '\([0-9]*\)'`        # Áß°ýÈ£°¡ À̽ºÄÉÀÌÇÁµÈ °Í¿¡ ÁÖÀÇÇϼ¼¿ä.
echo "\"$a\" ¿¡¼­ ¾ÕÂÊ¿¡ ³ª¿À´Â ¼ýÀÚ´Â \"$b\" ÀÔ´Ï´Ù."

echo

exit 0

Áß¿ä: match ´ë½Å : ¿¬»êÀÚ¸¦ ¾µ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, À§ÀÇ ¿¹Á¦¿¡¼­ b=`expr $a : [0-9]*` Àº b=`expr match $a [0-9]*` °ú ¿ÏÀüÈ÷ µ¿ÀÏÇÕ´Ï´Ù.

#!/bin/bash

echo
echo "\"expr $string :\" ¸¦ ¾²´Â ¹®ÀÚ¿­ ¿¬»ê"
echo "--------------------------------------"
echo

a=1234zipper43231
echo "\"`expr "$a" : '\(.*\)'`\" ¸¦ °¡Áö°í ¹®ÀÚ¿­ ¿¬»êÀ» ÇÕ´Ï´Ù."
#       À̽ºÄÉÀÌÇÁµÈ ¼Ò°ýÈ£.
#       Á¤±ÔÇ¥Çö½Ä ÆĽÌ.

echo "\"$a\" ÀÇ ±æÀÌ´Â `expr "$a" : '.*'` ÀÔ´Ï´Ù."   # ¹®ÀÚ¿­ ±æÀÌ

echo "\"$a\" ¿¡¼­ ¾ÕÂÊ¿¡ ³ª¿À´Â ¼ýÀÚÀÇ °¹¼ö´Â `expr "$a" : '[0-9]*'` ÀÔ´Ï´Ù."

echo "\"$a\" ¿¡¼­ ¾ÕÂÊ¿¡ ³ª¿À´Â ¼ýÀÚ´Â `expr "$a" : '\([0-9]*\)'` ÀÔ´Ï´Ù."

echo

exit 0

ÆÞ°ú sed°¡ ´õ ¶Ù¾î³­ ¹®ÀÚ¿­ ÆÄ½Ì ´É·ÂÀ» °¡Áö°í Àֱ⠶§¹®¿¡ ½ºÅ©¸³Æ®¿¡¼­ PerlÀ̳ª sedÀÇ °£´ÜÇÑ "¼­ºê·çƾ"À» ¾²´Â °ÍÀÌ exprÀ» ¾²´Â °Í º¸´Ù ´õ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù.

¹®ÀÚ¿­ ¿¬»ê¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ »çÇ×Àº 9.2ÀýÀ» Âü°íÇϼ¼¿ä.