重命名 GNU 并行创建的所有隐藏目录

重命名 GNU 并行创建的所有隐藏目录

GNU Parallel 使用参数输出隐藏目录,如下所示--results

我在 Ubuntu 上使用什么命令来更改所有目录,以便它们不再隐藏。这些目录称为:

'.\_ValidateAll.sh GL 170'/
'.\_ValidateAll.sh GL 190'/
'.\_ValidateAll.sh GL 220'/
'.\_ValidateAll.sh GL 355'/
'.\_ValidateAll.sh GL 357'/
'.\_ValidateAll.sh GL 359'/
'.\_ValidateAll.sh GL 361'/
'.\_ValidateAll.sh GL 363'/

在此输入图像描述

实际上,当我在目录上执行 cat 操作时,我没有看到单引号

vmdovs@ubuntu:/mnt/out/1$ cat 
GL170/                    .\_ValidateAll.sh GL 357/ .\_ValidateAll.sh GL 390/ .\_ValidateAll.sh GL 470/ .\_ValidateAll.sh GL 570/
rename.sh                 .\_ValidateAll.sh GL 359/ .\_ValidateAll.sh GL 400/ .\_ValidateAll.sh GL 480/ .\_ValidateAll.sh GL 572/
.\_ValidateAll.sh GL 190/ .\_ValidateAll.sh GL 361/ .\_ValidateAll.sh GL 410/ .\_ValidateAll.sh GL 500/ .\_ValidateAll.sh GL 574/
.\_ValidateAll.sh GL 220/ .\_ValidateAll.sh GL 363/ .\_ValidateAll.sh GL 420/ .\_ValidateAll.sh GL 530/ .\_ValidateAll.sh GL 590/
.\_ValidateAll.sh GL 355/ .\_ValidateAll.sh GL 368/ .\_ValidateAll.sh GL 440/ .\_ValidateAll.sh GL 540/ .\_ValidateAll.sh GL 710/

也可以 cd 访问该目录,如下

cd .\\_ValidateAll.sh\ GL\ 190/

答案1

如果唯一的问题是目录被隐藏,您只需删除.其名称开头的 即可使它们取消隐藏。例如,使用 perl-rename(rename在 Ubuntu 上调用):

rename 's/^\.//' '.\_Validate'*

或者,仅使用 shell 工具:

for dir in '.\_Validate'*; do echo mv "$dir" "${dir//.}"; done

然而,这些机器人给你留下了可怕的目录名称,其中有空格、斜杠和其他令人讨厌的东西。既然你要重命名,你也可以重命名为正常的名称:

rename 's/^\.\\//; s/\s+/_/g' '.\_Validate'*

这将导致:

$ ls -d _*
_ValidateAll.sh_GL_100  _ValidateAll.sh_GL_107  _ValidateAll.sh_GL_114
_ValidateAll.sh_GL_101  _ValidateAll.sh_GL_108  _ValidateAll.sh_GL_115
_ValidateAll.sh_GL_102  _ValidateAll.sh_GL_109  _ValidateAll.sh_GL_116
_ValidateAll.sh_GL_103  _ValidateAll.sh_GL_110  _ValidateAll.sh_GL_117
_ValidateAll.sh_GL_104  _ValidateAll.sh_GL_111  _ValidateAll.sh_GL_118
_ValidateAll.sh_GL_105  _ValidateAll.sh_GL_112  _ValidateAll.sh_GL_119
_ValidateAll.sh_GL_106  _ValidateAll.sh_GL_113  _ValidateAll.sh_GL_120

重要提示:请注意,我没有检查文件名冲突。如果您将其中之一重命名为已存在的文件,那么您将覆盖现有文件。

答案2

您可以使用 GNU 并行:

parallel mv {} '{=s/^\.\\_//=}' ::: '.\_ValidateAll'*

这将从.\_名称中删除。

也可以用 _ 替换空格,运行:

parallel mv {} '{=s/^\.\\_//; s/\s/_/g=}' ::: '.\_ValidateAll'*

答案3

原则上(您可能知道),如果文件和目录的名称以..因此,您可以通过删除该 来使它们再次“可见” .。可以通过bash使用内置的字符串操作函数来完成:

user@host$ for dir in '.\_ValidateAll'*; do newname="${dir#.}"; mv "$dir" "$newname"; done

但是,建议您事先尝试一下以验证其是否正常工作

user@host$ for dir in '.\_ValidateAll'*; do newname="${dir#.}"; echo "rename $dir to $newname"; done

更新:您绝对应该遵循@terdon 答案中的建议,利用这个机会并摆脱该过程中的所有特殊字符。

相关内容