find:bad选项-printf find:path-list predicate-list shell脚本

时间:2013-12-04 14:21:50

标签: bash shell solaris

我刚刚创建了一个非常基本的shell脚本,它接受输入路径并显示该路径中文件的属性。

问题:脚本在我的电脑上运行,但当我尝试在我的大学UNIX服务器上运行时,我收到一个错误:

find: bad option -printf
             find: path-list predicate-list
  • 我的电脑:Ubuntu
  • 我的大学服务器:SunOS nyx 5.9 Generic_118558-11 sun4u sparc SUNW,Sun-Fire-V210

代码:

#!/bin/bash

echo " enter address in form : /home/rohan/../.."
read ARG

if [ -n "$ARG" ]; then
echo "input path taken : $ARG"    
# ls -lsh $ARG"/"*.txt 

else
     ARG=$(pwd)
fi

echo " enter option "
echo " 1. file size, 2. permission, 3. owner/group, 4. all , 5. exit" 
read OPTION

while [ $OPTION != "5" ]
do


  if [ $OPTION = "1" ]; then
  find $ARG"/"*.txt  -printf " %p     %s bytes   \n"


 elif [ $OPTION = "2" ]; then
 find $ARG"/"*.txt  -printf " %p     %M    \n" 


 elif [ $OPTION = "3" ]; then 
 find $ARG"/"*.txt  -printf " %p     %g    \n" 

 elif [ $OPTION = "4" ]; then 
 find $ARG"/"*.txt  -printf "%p      %s bytes    %M     %g    \n"

   fi

  echo "enter option again"
  echo " 1. file size, 2. permission, 3. owner/group, 4. all , 5. exit" 
  read OPTION
 done

2 个答案:

答案 0 :(得分:1)

Solaris -printf和一般语法

有两个问题

尝试:

find $ARGS -name '*.txt' -exec ls -l {} \; | nawk '{print $5, $(NR) }'

其中ARGS是不是文件名的目录。使用名称。下一个printf - 你将不得不使用我给你的东西 - 将每个文件的管道ls -l变为nawk - 在Solaris上不是awk - 并打印你想要的字段。字节是字段#5,因此'{print $5}'适用于此。最后一个字段$(NR)是文件名

solaris上的awk是一个非常非常古老的实现,你无法移植unbuntu GNU awk语法,并且通常可以按照你想要的方式在solaris awk上运行。

答案 1 :(得分:1)

find -printf的替代方法是在一组文件上使用stat --printf来打印有关它们的有用信息。这是一个代码片段,它将对find的调用分解出来并使用shell glob来匹配文件集:

# ...


usage() {
   echo "enter option again"
   # ...
}

# read options
while read OPTION; do
    format=""
    case $OPTION in
        1) format="%n    %s bytes\n" ;;
        2) format="%n    %A\n" ;;
        3) format="%n    %U/%G\n" ;;
        4) format="%n    %s bytes  %A  %U/%G\n" ;;
        5) exit ;;
        *) usage ;;
    esac

    # print file info 
    shopt -s nullglob
    for file in "$ARG"/*.txt; do
        stat --printf "$format" "$file"
    done
done