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),因为我仍在努力理解这种组合是如何工作的。:(所以,如果这里有人可以提供解决方案和详细解释,我将不胜感激。谢谢。
你可以这样做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)