Como posso renomear um diretório com nome apenas de caracteres não imprimíveis?

4

No SunOS tenho diretórios com nomes contendo apenas caracteres não imprimíveis. O comando

ls -ldb *

retorna o seguinte (alguns espaços excluídos)

drwxr-xr-x 3 user1 group1 3 Feb 4 18:10 22011220162201622016220112201122011220112201122011220162201122012/
drwxr-xr-x 3 user1 group1 3 Feb 4 11:03 2201622016/

Como posso renomear esses diretórios?

    
por nickm 06.02.2016 / 20:33

3 respostas

4

Um texto semelhante como ls -ldb * pode ser produzido por (ksh, bash, zsh) $'...' , como este:

echo $'2201622016'

Que é apenas um monte de novas linhas (Oct 012, Hex 0x0A) e anos.

Se limitado no shell que você pode usar, use printf:

printf '2201622016'

Observe que o código acima não inclui o último / . O que de fato não é necessário para dar o nome do diretório ao kernel.

Então, para apagar, use:

rmdir "$(printf '2201622016')"

Para renomear o uso:

mv "$(printf '2201622016')" newname

O outro arquivo precisará disso:

mv "$(printf '22011220162201622016220112201122011220112201122011220162201122012')" newname

Ou, se houver não outros arquivos com um nome semelhante, uma string mais curta:

mv "$(printf '22011220162201622016')"* newname
    
por 06.02.2016 / 21:01
1

Código C / C ++

#include<cstdio>

int main(){
 rename(Old,New);
}

Compile

Reeplace Old e New usando aspas \" e barra dupla de volta \

g++ -O3 -o bin file.cpp -D Old=\"\0122016\0122016/\" -D New=\"new\"

Executar

./bin

    
por 06.02.2016 / 20:48
1

pseudocódigo não testado:

i=1
for d in *
do
  echo "$d"
  echo Enter Y to rename the above directory:
  read answer
  if [ $answer = "Y" ]
  then
    mv "$d" tempdir${i}
    i=$((i+1))
  fi
done
    
por 06.02.2016 / 21:12