重新命名 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 的回答中的建議,利用這個機會並擺脫過程中的所有特殊字元。

相關內容