LINUX - shell脚本查找并列出具有在目录树中写入的权限的所有文件

时间:2014-04-04 15:45:17

标签: linux bash shell ubuntu

以下是我的代码:

echo $(pwd > adress)
var=$(head -1 adress)
rm adress

found=0 #Flag 
fileshow()
{
    cd $1
    for i in *
        do
            if [ -d $i ] 
                then 
                    continue
            elif [ -w $i ]
                then 
                    echo $i 
                    found=1 
            fi
        done
    cd ..
}
fileshow $1

if [ $found -eq 0 ]
    then
        clear
        echo "$(tput setaf 1)There arent any executable files !!!$(tput sgr0)"
fi

它工作但它只在当前目录中找到文件。

有人告诉我,我需要使用某种递归方法来遍历所有子目录,但我不知道该怎么做。

所以,如果有人能帮助我,我将非常感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用find

find /path/to/directory/ -type f -perm -o=w

-o=w暗示每个文件具有"其他写权限"集。

,或者

find /path/to/directory/ -type f -perm /u+w,g+w,o+w

其中/u+w,g+w,o+w表示每个文件都设置了用户,组或其他写入权限。

答案 1 :(得分:1)

您的脚本的作用是查找当前工作目录下的非目录且可写入当前用户的文件。这可以通过以下命令实现:

find ./ -type f -writable

使用-type f的优点是它还排除了符号链接和其他特殊类型的文件,如果这是你想要的。如果您想要所有非目录的文件(如脚本所示),那么您可以使用:

find ./ ! -type d -writable

如果您想排序这些文件(添加问题,假设按字典升序排列),您可以使用sort

find ./ -type f -writable | sort

如果您想将这些已排序的文件名用于其他内容,则规范模式将是(处理带有嵌入换行符和其他很少使用的字符的文件名):

while read -r -d $'\0'; do
    echo "File '$REPLY' is an ordinary file and is writable"
done < <(find ./ -type f -writable -print0 | sort -z)

如果您使用的旧find版本不支持方便的-writable谓词(added to v.4.3 in 2005),那么您只能拥有文件权限。然后你必须明确你在特定上下文中的“可写”是什么意思(可写给谁?),你可以用{gregb&#39中描述的-writable谓词替换-perm谓词的答案。如果您认为自己的意思是“可由任何人编写”,则可以使用-perm /u=w,g=w,o=w-perm /222,但实际上只有使用权限才能获得-writable的所有好处。另请注意,+-perm的权限测试形式已弃用,不应再使用;应该使用/表格。