我刚刚创建了一个非常基本的shell脚本,它接受输入路径并显示该路径中文件的属性。
问题:脚本在我的电脑上运行,但当我尝试在我的大学UNIX服务器上运行时,我收到一个错误:
find: bad option -printf
find: path-list predicate-list
代码:
#!/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
答案 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