我正在编写一个相当基本的shell脚本,该脚本循环遍历目录中的文件并重命名该文件,并在文件的开头添加一个点(。),但是它不起作用
对出什么问题有任何见解吗?
for file in /tmp/test/*; do
mv $file \\.$file;
done
答案 0 :(得分:2)
有两个问题。
\.
而不是.
。 \\
命令中不需要mv
。更正的代码:
for file in /tmp/test/*; do
mv "$file" "${file%/*}/.${file##*/}";
done
${file%/*}
返回$file
的值,所有内容都从最后删除的/
开始,这是路径名的目录部分。 ${file##*/}"
返回$file
的值,其中包括最后一个删除的/
的所有内容,这是文件名部分。然后将它们与它们之间的/.
放在一起,从而在文件名部分添加所需的.
前缀。有关这些运算符的详细信息,请参见Bash parameter expansion documentation。
另外,请记住用引号引起来,这样当变量包含空格时就不会出错。
答案 1 :(得分:0)
这是一个带有目录参数的简单脚本:
hide_files.sh:
if [ $# -ne 1 ] || [ ! -d $1 ]; then
echo 'invalid dir arg.'
exit 1
fi
for f in $(ls $1); do
mv -v "$1/$f" "$1/.$f"
done
输出:
$ bash hide_files.sh mydir
mydir/a -> mydir/.a
mydir/c -> mydir/.c