Переименовать все скрытые каталоги, созданные GNU parallel

Переименовать все скрытые каталоги, созданные GNU parallel

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'*

Или, используя только инструменты оболочки:

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:

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, чтобы воспользоваться возможностью и избавиться от всех специальных символов в этом процессе.

Связанный контент