从文件名bash脚本中删除前导点

时间:2011-01-21 19:39:22

标签: linux bash find

我在一堆目录中有一些带有前导点的文件,因此被隐藏了。我想恢复它并去除前导点。

我未能成功完成以下任务:

for file in `find files/ -type f`;
do
base=`basename $file`
if [ `$base | cut -c1-2` = "." ];
then newname=`$base | cut -c2-`;
dirs=`dirname $file`;
echo $dirs/$newname;
fi
done

条件声明失败:

[: =: unary operator expected

此外,有些文件中有空格,文件会将它们拆分。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:23)

从变量开头删除内容的最简单方法是使用${var#pattern}

$ FILENAME=.bashrc;    echo "${FILENAME#.}"
bashrc
$ FILENAME=/etc/fstab; echo "${FILENAME#.}"
/etc/fstab

请参阅bash手册页:

  

<强> $ {参数#字}
  的 $ {参数##字}

     

这个词被扩展为产生一个模式,就像路径名扩展一样。如果模式匹配参数值的开头,那么扩展的结果是                 最短匹配模式(“#”案例)或最长匹配模式(“##”案例)的参数扩展值已删除。

顺便说一下,使用更具选择性的find命令,您不需要做所有艰苦的工作。您可以find仅匹配带有前导点的文件:

find files/ -type f -name '.*'

将所有这些扔在一起,然后:

find files/ -type f -name '.*' -printf '%P\0' |
    while read -d $'\0' path; do
        dir=$(dirname "$path")
        file=$(basename "$path")
        mv "$dir/$file" "$dir/${file#.}"
    done

附加说明:

  1. 要正确处理带空格的文件名,您需要在引用变量名时引用它们。写“$ file”而不只是$file

  2. 为了获得额外的稳定性,-printf '\0'read -d $'\0'使用NUL字符作为分隔符,因此即使带有嵌入换行符'\n'的文件名也可以使用。

答案 1 :(得分:7)

find files/ -name '.*' -printf '%f\n'|while read f; do
        mv "files/$f" "files/${f#.}"
done

答案 2 :(得分:1)

  1. 此脚本适用于您的任何文件 即使他们有,也可以扔掉它 空间,换行或其他邪恶的 他们名字中的人物。
  2. 无论隐藏文件有多少个子目录
  3. ,它都能正常工作
  4. 与目前为止的其他答案不同,你 更改路径时,必须更改脚本的其余部分 给find
  5. *注意:我添加了echo,以便您可以像干跑一样进行测试。如果您对结果感到满意,请删除单个echo

    find . -name '.*' -exec sh -c 'for arg; do d="${arg%/*}"; f=${arg:${#d}}; echo mv "$arg" "$d/${f#.}"; done' _ {} +