脚本bash chmod在cicle中

时间:2016-06-26 23:10:20

标签: linux bash

我希望那个脚本在我介绍一个目录时做一个cicle,并会询问我在那里的每个文件来改变烫发。为什么这个输出总是不能fin"文件?"但文件存在

fucntion permi {

    echo "What is the path of the file? the introduce the name of the file:"

    read DIRECT

    file=`ls -l ${dir} | cut -f 9 -d " "`

    while read file
    do

        echo "[u|g|o]"

        read who

        echo "[r|w|x]"

        read ans

        chmod ${who}+${ans} $file

    done

}

3 个答案:

答案 0 :(得分:0)

你可以试试这个

fucntion permi {

echo "What is the path of the file? the introduce the name of the file:"
# read path from user with pattern .. eg (/home/mebada/test/* for all files, /home/mebada/test/*txt for all text files) 

read path 

# here I am iterating over the list of directory files .. no need to cut because I am just ls without ls long format (ls -l)
for myFile in `ls  $path`;  do
    # showing file current permission
    ls -l ${myFile}
    echo 
    echo "[u|g|o]"
    echo 
    read who

    echo "[r|w|x]"

    read ans
    #change file permission 
    chmod ${who}+${ans} $myFile

    # show after permission 
    ls -l $myFile
    echo 
    #Separator between two files
    echo " ---- "
  done
 }

答案 1 :(得分:0)

这里有四个主要问题。首先,ls -l ${dir} | cut -f 9 -d " " 生成文件名列表。它挑出了第9个"领域"来自长格式ls列表,但可能是也可能不是文件名,具体取决于ls -l打印的内容。在我的Mac上,它主要打印部分日期字段。通常parsing ls is a bad idea,解析ls -l的情况更糟。有更好的方法来做到这一点。

其次,循环(while read file)并不像你想要的那样做任何事情。它的作用是从标准输入读取行(通常,这意味着它等待用户输入内容),并将其读取的内容放入变量file(它替换ls -l ${dir} | cut -f 9 -d " "的输出{1}})。您想要做的是从变量file读取,而不是变量。

第三个问题是,在处理您找到的文件时(例如chmod),您需要提供目录路径文件名,例如{ {1}}。

但是,有一种更好的方法可以同时解决所有这三个问题。只需使用chmod ${who}+${ans} $dir/$file即可。通配符将扩展为for file in "${dir}"/*中的文件列表(包括目录路径),而不会出现处理${dir}输出的任何混乱。

第四个主要问题是,您没有告诉用户您要求获得权限的文件;脚本只是询问" [u | g | o]"和" [r | w | x]"一遍又一遍,没有说明它适用于哪个文件。

我还有三个小建议:ls关键字是非标准的;定义函数的更标准方法是使用括号:function。此外,使用permi() { ...打印提示,而不是echo提示输入。最后,最好在变量引用周围加上双引号,以避免在包含空格或其他特殊字符的情况下出现问题。通过所有这些变化,我得到的是:

read -p

答案 2 :(得分:-1)

当我运行ls -l | cut -f 9 -d " "时,我得到一些空字段,几年或一位数字。我建议只使用ls(没有-l)来获取文件名,因为您似乎只关心文件名,而不是其他任何ls -l打印

然后在更改权限(chmod ... "$file")时引用文件名,以防它有空格。