我有一些目录中有一些带有前导点的文件,因此被隐藏了.我想恢复它并去除前导点.
我没有成功,有以下几点:
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)
补充说明:
要正确处理带空格的文件名,需要在引用它们时引用变量名.写"$ file"而不是仅仅$file.
为了获得额外的稳健性,-printf '\0'并read -d $'\0'使用NUL字符作为分隔符,因此即使带有嵌入换行符的文件名'\n'也可以使用.
find files/ -name '.*' -printf '%f\n'|while read f; do
mv "files/$f" "files/${f#.}"
done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15726 次 |
| 最近记录: |