【问题标题】:LINUX - shell script finding and listing all files with rights to write in directory treeLINUX - shell 脚本查找并列出所有有权写入目录树的文件
【发布时间】:2014-04-04 15:45:16
【问题描述】:

这是我到目前为止的代码:

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

它可以工作,但它只在当前目录中查找文件。

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

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

谢谢!

【问题讨论】:

    标签: linux bash shell ubuntu


    【解决方案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)
    

    如果您使用的是不支持方便的 -writable 谓词 (added to v.4.3 in 2005) 的非常旧版本的 find,那么您只有文件权限才能继续。然后,您必须清楚在特定上下文中“可写”的含义(可写给谁?),您可以将-writable 谓词替换为@gregb 的答案中描述的-perm 谓词。如果你决定你的意思是“任何人都可以写”,你可以使用-perm /u=w,g=w,o=w-perm /222,但实际上没有办法仅仅使用权限来获得-writable 的所有好处。另请注意,-perm+ 形式的权限测试已被弃用,不应再使用;应该改用/ 形式。

    【讨论】:

    • -writable 选项在我的 find (GNU find version 4.2.27) 版本中似乎不可用。
    • 啊,我有 4.4.2。我会在一分钟内更新我的答案。
    • 是的,这很好,但是当我找到这些文件时,我需要将它们传递给 C 进程,该进程必须对它们进行 ASC 排序。对不起,我从一开始就没有这么说。那么我怎么能用shell脚本做到这一点呢?我需要使用某种变量来存储我的文件或? IDK 正如我所说,我对 shell 脚本的概念并不十分熟悉 :)
    • 我相信您正在寻找管道|。所以你会做一个find ... | /path/to/c_process。这会将find 命令的输出重定向到C 进程的输入。
    【解决方案2】:

    你可以使用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 表示每个文件都设置了用户、组或其他写入权限。

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2018-06-25
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 2021-09-28
      相关资源
      最近更新 更多