【发布时间】:2013-12-02 06:27:14
【问题描述】:
我想知道你是否可以帮助我修复 bash 脚本,该脚本应该取消隐藏目录中的所有隐藏文件。 问题出在哪里?
param='.'
for file in $param*; do
mv $file $(echo $file | sed 's/^.\(.*\)/\1/')
done
exit
【问题讨论】:
标签: regex bash sed mv hidden-files
我想知道你是否可以帮助我修复 bash 脚本,该脚本应该取消隐藏目录中的所有隐藏文件。 问题出在哪里?
param='.'
for file in $param*; do
mv $file $(echo $file | sed 's/^.\(.*\)/\1/')
done
exit
【问题讨论】:
标签: regex bash sed mv hidden-files
@anubhava 的回答有效,但这里有一个用于处理隐藏文件/文件夹的修改的通用解决方案,它:
既不依赖也不改变全局状态(配置)。
( # Execute in subshell to localize configuration changes below.
GLOBIGNORE=".:.." # Do not match '.' and '..'.
shopt -s nullglob # Expand globbing pattern to empty string, if no matches.
for f in .*; do # Enumerate all hidden files/folders, if any.
# Process "$f" here; e.g.: mv -n "$f" "${f:1}"
done
)
如果您想避免使用子shell,您可以使用以下方法,它明确排除了. 和.. 以及在没有匹配的情况下的未扩展模式(如果@ 987654324@恰好包含.:..):
for f in .*; do
if [[ $f != '.' && $f != '..' && -e $f ]]; then
# Process "$f" here; e.g.: mv -n "$f" "${f:1}"
fi
done
向@jthill、@anubhava、@Mike 致敬。
【讨论】:
这只会取消隐藏所有隐藏文件,远离你的主目录!!!
ls -1Ap |grep "^\." |grep -v "/" |while read F; do mv $F ${F:1}; done
这将再次取消隐藏所有隐藏的文件和目录:远离你的主目录!!!
ls -1A |grep "^\." |while read F; do mv $F ${F:1}; done
测试这类危险游戏的最佳方法是在你的机器上为自己创建一个额外的帐户...如果你把自己的帐户搞砸了,就会出现“眼泪无限(tm)”
如果您想先对其进行测试(这是非常明智的做法):
ls -1A |grep "^\." |while read F; do echo "mv $F ${F:1}"; done
【讨论】:
这个for loop 应该可以工作:
export GLOBIGNORE=".:.."
for file in .*; do
mv -n "$file" "${file#.}"
# mv -n "$file" "${file:1}"
done
PS:最好在进行大规模 mv/重命名之前备份您的文件
【讨论】:
. 和.. 吗?
mv "$file" "${file:1}"
export GLOBIGNORE=".:..",然后使用.* 将跳过这些。
test -e "${file#.}"。 ;-)
我自己不会像那样对它们进行大规模重命名,我会为它们添加可见的符号链接:
while read f; do
ln -s "$f" "visible-${f#./}"
done <<EOD
$(find -mindepth 1 -maxdepth 1 -name '.*')
EOD
【讨论】: