我想知道你是否可以帮助我修复bash脚本,该脚本应该取消隐藏目录中的所有隐藏文件。问题出在哪里?
param='.'
for file in $param*; do
mv $file $(echo $file | sed 's/^.(.*)/1/')
done
exit
这个for loop
应该工作:
export GLOBIGNORE=".:.."
for file in .*; do
mv -n "$file" "${file#.}"
# mv -n "$file" "${file:1}"
done
PS:最好在进行大规模mv/rename-
@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,可以使用以下方法,明确排除.
和..
,以及在没有匹配的情况下(如果GLOBIGNORE
恰好包含.:..
)的未扩展模式:
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致敬。
我自己不会大规模重命名它们,我会添加可见的符号链接到它们:
while read f; do
ln -s "$f" "visible-${f#./}"
done <<EOD
$(find -mindepth 1 -maxdepth 1 -name '.*')
EOD
这只会取消隐藏所有隐藏的文件,远离主目录!!!
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