我希望那个脚本在我介绍一个目录时做一个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
}
答案 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"
)时引用文件名,以防它有空格。