【问题标题】:unhide hidden files in unix with sed and mv commands使用 sed 和 mv 命令取消隐藏 unix 中的隐藏文件
【发布时间】: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


    【解决方案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
      )
      

    如果您想避免使用子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 致敬。

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        【解决方案3】:

        这个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#.}"。 ;-)
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-30
          • 2017-09-26
          • 1970-01-01
          • 2013-11-18
          • 2013-08-10
          • 1970-01-01
          相关资源
          最近更新 更多