将文件重命名为隐藏文件以进行循环

时间:2018-10-09 19:19:17

标签: bash

我正在编写一个相当基本的shell脚本,该脚本循环遍历目录中的文件并重命名该文件,并在文件的开头添加一个点(。),但是它不起作用

对出什么问题有任何见解吗?

for file in /tmp/test/*; do
 mv $file \\.$file;
done

2 个答案:

答案 0 :(得分:2)

有两个问题。

  1. 您要将点放在整个路径名之前,而不仅仅是文件名部分。
  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