在Unix中使用sed和mv命令取消隐藏文件的隐藏状态

4

我想知道你是否能帮我修复bash脚本,该脚本应该可以显示目录中所有隐藏文件。 问题出在哪里?

param='.'
for file in $param*; do
mv $file $(echo $file | sed 's/^.\(.*\)/\1/')
done
exit
4个回答

7
这个for循环应该可以正常工作:
export GLOBIGNORE=".:.."
for file in .*; do
   mv -n "$file" "${file#.}"
   # mv -n "$file" "${file:1}"
done

提示:在进行大量的文件移动/重命名操作前最好备份您的文件。


1
这不会尝试重命名 ... 吗? - damienfrancois
1
你也可以写成 mv "$file" "${file:1}" - damienfrancois
1
请参见其他地方,包括bash中花括号语法的含义是什么? - Jonathan Leffler
3
你也可以在脚本中使用 export GLOBIGNORE=".:..",然后使用 .* 将会跳过这些内容。 - mpontillo
1
在将另一个文件覆盖到现有文件之前,可能还想要先执行test -e "${file#.}"来进行测试。;-) - mpontillo
显示剩余9条评论

1

@anubhava的答案可行,但这里有一个修订过的、通用的解决方案来处理隐藏的文件/文件夹:

  • 正确处理边缘情况(隐藏文件/文件夹的不存在)。
  • 既不依赖于也不更改全局状态(配置)。

    ( # 在子shell中执行以本地化以下配置更改。
    GLOBIGNORE=".:.."   # 不匹配“.”和“..”。
    shopt -s nullglob   # 如果没有匹配项,则将扩展globbing模式为空字符串。
    for f in .*; do     # 枚举所有隐藏文件/文件夹(如果有)。
      # 在此处处理“$f”;例如: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。

0

我不会像那样批量重命名它们,我会为它们添加可见的符号链接:

while read f; do
        ln -s "$f" "visible-${f#./}"
done <<EOD
$(find -mindepth 1 -maxdepth 1 -name '.*')
EOD

0

这将只会取消隐藏所有的文件,远离你的主目录!!!

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

测试这类危险游戏最好的方法是在您的机器上创建一个额外的账户...如果您搞砸了自己的账户,将会有"无限的眼泪™"

如果您想先进行测试(这是非常明智的做法):

ls -1A |grep "^\." |while read F; do echo "mv $F ${F:1}"; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接