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

Rad*_*dek 12 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
Run Code Online (Sandbox Code Playgroud)

在条件声明中失败了:

[: =: unary operator expected
Run Code Online (Sandbox Code Playgroud)

此外,一些文件中有一个空格,文件将它们分开.

任何帮助,将不胜感激.

Joh*_*ica 26

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

$ FILENAME=.bashrc;    echo "${FILENAME#.}"
bashrc
$ FILENAME=/etc/fstab; echo "${FILENAME#.}"
/etc/fstab
Run Code Online (Sandbox Code Playgroud)

请参阅bash手册页:

$ {parameter#word}
$ {parameter ## word}

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

顺便说一句,通过更有选择性的find命令,您不需要做所有艰苦的工作.您find只能使用带有前导点的匹配文件:

find files/ -type f -name '.*'
Run Code Online (Sandbox Code Playgroud)

扔掉所有这些,然后:

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
Run Code Online (Sandbox Code Playgroud)

补充说明:

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

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


Arn*_*anc 7

find files/ -name '.*' -printf '%f\n'|while read f; do
        mv "files/$f" "files/${f#.}"
done
Run Code Online (Sandbox Code Playgroud)