我在一堆目录中有一些带有前导点的文件,因此被隐藏了。我想恢复它并去除前导点。
我未能成功完成以下任务:
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
此外,有些文件中有空格,文件会将它们拆分。
任何帮助都将不胜感激。
答案 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
附加说明:
要正确处理带空格的文件名,您需要在引用变量名时引用它们。写“$ file”而不只是$file
。
为了获得额外的稳定性,-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)
find
*注意:我添加了echo
,以便您可以像干跑一样进行测试。如果您对结果感到满意,请删除单个echo
。
find . -name '.*' -exec sh -c 'for arg; do d="${arg%/*}"; f=${arg:${#d}}; echo mv "$arg" "$d/${f#.}"; done' _ {} +