UNIX: Como alterar todos os arquivos ocultos para visíveis em vários subdiretórios

2

Tenho centenas de subdiretórios em um diretório em que todos eles contêm arquivos ocultos e preciso remover o período no início deles para torná-los visíveis. Eu encontrei um comando para ir em cada diretório e alterá-los para torná-los visíveis, mas eu preciso saber como fazer este comando funcionar de um diretório para cima.

rename 's/\.//;' .*
    
por Ortoch 02.10.2017 / 00:39

6 respostas

4

Com o GNU find :

find /some/path -type f -name '.*' -execdir sh -c 'mv -i "$0" "./${0#./.}"' {} \;

com Perl rename :

find /some/path -type f -name '.*' -exec prename -i -n 's!.*/\K\.!!' {} +

(remova -n quando estiver satisfeito com os resultados).

    
por 02.10.2017 / 05:15
2

esta é a linha que corrigiu tudo e finalmente encontrou a resposta

find -mindepth 1 -depth -exec rename -n 's{/\.([^\/]*$)}{/$1}' {} +
    
por 02.10.2017 / 02:04
2

Basta usar find junto com um script de shell simples para renomear e verificar se nenhum arquivo existente é sobrescrito:

find . -type f -name '.*' \
    -execdir sh -c '[ ! -e "${1#.}" ] && mv "$1" "${1#.}"' sh {} ';'

A opção -execdir executará seu argumento dentro do diretório pai do nome encontrado e {} será o nome base (nome sem caminho) do nome encontrado. Esta opção é uma extensão amplamente implementada para o padrão find .

O script sh -c simplesmente fará com que o nome desejado já não seja usado e renomeie o arquivo.

A substituição do parâmetro ${1#.} terá o valor de $1 (o primeiro argumento de linha de comando do script sh -c , que é um nome de arquivo) e removerá o ponto inicial.

    
por 02.10.2017 / 08:23
0

Isso fará o que você quiser:

find . -iname ".*" -exec realpath {} \; | rename -n 's/\.(.*)/$1/'

Estrutura do arquivo:

.
├── game
│   ├── .keie
│   ├── .kjae
│   ├── .ndhe
│   └── shame
│       ├── .alwo
│       ├── .asdjd
│       └── .kajd
├── .jsdsd
├── .lewe
└── .skdsd

Execução de teste:

rename(/home/george/Documents/askubuntu/rename/down/.lewe, /home/george/Documents/askubuntu/rename/down/lewe)
rename(/home/george/Documents/askubuntu/rename/down/.jsdsd, /home/george/Documents/askubuntu/rename/down/jsdsd)
rename(/home/george/Documents/askubuntu/rename/down/game/shame/.asdjd, /home/george/Documents/askubuntu/rename/down/game/shame/asdjd)
rename(/home/george/Documents/askubuntu/rename/down/game/shame/.kajd, /home/george/Documents/askubuntu/rename/down/game/shame/kajd)
rename(/home/george/Documents/askubuntu/rename/down/game/shame/.alwo, /home/george/Documents/askubuntu/rename/down/game/shame/alwo)
rename(/home/george/Documents/askubuntu/rename/down/game/.ndhe, /home/george/Documents/askubuntu/rename/down/game/ndhe)
rename(/home/george/Documents/askubuntu/rename/down/game/.keie, /home/george/Documents/askubuntu/rename/down/game/keie)
rename(/home/george/Documents/askubuntu/rename/down/game/.kjae, /home/george/Documents/askubuntu/rename/down/game/kjae)
rename(/home/george/Documents/askubuntu/rename/down/.skdsd, /home/george/Documents/askubuntu/rename/down/skdsd)

Resultados:

.
├── game
│   ├── keie
│   ├── kjae
│   ├── ndhe
│   └── shame
│       ├── alwo
│       ├── asdjd
│       └── kajd
├── jsdsd
├── lewe
└── skdsd

Informação:

realpath {} : obtenha o caminho real para o arquivo de interesse

-n : usado para testar a execução, remova quando estiver pronto para renomear os arquivos.

    
por 02.10.2017 / 01:31
-1
find . -type f -name .\* -exec rename -n 's/\.//;' {} +
    
por 02.10.2017 / 01:14
-1

renomear não tem uma opção recursiva. Se você quiser renomear os arquivos no diretório atual e em todos os seus subdiretórios, coloque o seguinte script no diretório pai e execute-o.

#!/bin/bash
for i in 'find . -name ".*"'
  do
    rename 's/\.//' $i
  done
    
por 02.10.2017 / 01:17