如何重命名(取消隐藏)目录中的所有文件和子目录?

Luk*_*kim 5 command-line batch-rename

我想制作一个脚本来一次性“取消隐藏”某个目录中的所有文件和目录,例如./unhide test.

test/
??? sub1
?   ??? .hiddenfile1
??? sub2
    ??? .hiddendir
        ??? .hiddendirsub
        ??? .hiddenfile2
        ??? not.hidden
Run Code Online (Sandbox Code Playgroud)

期望的结果:

test/
??? sub1
?   ??? hiddenfile1
??? sub2
    ??? hiddendir
        ??? hiddendirsub
        ??? hiddenfile2
        ??? not.hidden
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我对此还是个新手,我一直在尝试使用 找到解决方案find,但一直停留在-exec, 和rename(或mv),因为我仍在努力理解这种组合是如何工作的。:(所以,如果这里有人可以提供解决方案和详细解释,我将不胜感激。谢谢。

des*_*ert 7

你可以这样做find

find /path/to/test -depth -name ".*" -execdir rename -n 's|/\.|/|' {} +
Run Code Online (Sandbox Code Playgroud)

这仅打印重命名操作,如果它显示您想要删除-n选项的内容。

说明

  • -depth– 让我们find从下到上处理,在其父目录之前重命名文件
  • -name ".*"– 让我们find搜索以点开头的文件(一切都是文件) – 这里的点是文字,因为这不是正则表达式
  • -execdir … +在匹配文件的目录中执行
  • rename 's|/\.|/|' {}– 替换第一次出现的“/”。从带有“/”的匹配文件的路径(find的占位符为{}),基本上从文件名的开头删除点
    这将例如rename 's|/\.|/|' ./.hiddenfile1在您的情况下,这将被重命名为./hiddenfile1

示例运行

$ tree -a
.
??? sub1
?   ??? .hiddenfile1
??? sub2
    ??? .hiddendir
        ??? .hiddendirsub
        ??? .hiddenfile2
        ??? not.hidden

$ find ~/test -depth -name ".*" -execdir rename 's|/\.|/|' {} +
$ tree -a
.
??? sub1
?   ??? hiddenfile1
??? sub2
    ??? hiddendir
        ??? hiddendirsub
        ??? hiddenfile2
        ??? not.hidden
Run Code Online (Sandbox Code Playgroud)

在脚本中的使用

在脚本中,您可以简单地使用位置参数而不是路径,它可以是相对的或绝对的——请记住正确引用

#!/bin/bash
find "$1" -depth -name ".*" -execdir rename -n 's|/\.|/|' {} +
Run Code Online (Sandbox Code Playgroud)