GNU Parallelは、--results
パラメータを使用して、次のように隠しディレクトリを出力しています。
Ubuntuでallコマンドをディレクトリに変更して非表示にしないために使用するコマンドは何ですか。次のディレクトリが呼び出されます。
'.\_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'/
実際にディレクトリで猫を実行すると、単一引用符が表示されません
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/
ディレクトリが非表示になっていることが唯一の問題である場合は、.
それらを非表示にしないために、名前の先頭から。たとえば、Perl-rename(Ubuntuではrename
と呼ばれます)を使用します。
rename 's/^\.//' '.\_Validate'*
または、シェルツールのみ:
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
重要:ファイル名の衝突をチェックしていないことに注意してください。これらのいずれかの名前を既存の名前に変更すると、既存のファイルが上書きされます。
原則として(おそらくご存知のとおり)、ファイルとディレクトリは、名前が.
で始まる場合は非表示になります。したがって、その.
を削除することで、それらを再び「表示」することができます。これは、組み込みの文字列操作関数を使用して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の回答にあるアドバイスに従って、機会を活用し、そのプロセス内のすべての特殊文字を取り除く必要があります。
GNU Parallel:
parallel mv {} '{=s/^\.\\_//=}' ::: '.\_ValidateAll'*
これにより、名前から.\_
が削除されます。
スペースも_で置き換えるには:
parallel mv {} '{=s/^\.\\_//; s/\s/_/g=}' ::: '.\_ValidateAll'*