4

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

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

4 回答 4

7

for loop应该有效:

export GLOBIGNORE=".:.."
for file in .*; do
   mv -n "$file" "${file#.}"
   # mv -n "$file" "${file:1}"
done

PS:最好在进行大量 mv/rename 之前备份您的文件

于 2013-11-18T22:18:10.450 回答
1

@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
    )
    

如果您想避免使用 subshel​​l,可以使用以下方法,该方法明确排除.并且..如果没有匹配项(如果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 致敬。

于 2013-11-19T04:08:50.440 回答
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

测试这些危险游戏的最佳方法是在您的机器上为自己创建一个额外的帐户......如果您搞砸了自己的帐户,将会出现“眼泪无限(tm)”

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

ls -1A |grep "^\." |while read F; do echo "mv $F ${F:1}"; done
于 2013-11-18T23:36:27.090 回答
0

我自己不会像那样大规模重命名它们,我会为它们添加可见的符号链接:

while read f; do
        ln -s "$f" "visible-${f#./}"
done <<EOD
$(find -mindepth 1 -maxdepth 1 -name '.*')
EOD
于 2013-11-18T22:24:37.890 回答