Eu tenho esta estrutura de pastas:
├── foo1
│ ├── bar1.txt
│ └── bar2.txt
├── foo2
│ ├── bar3.txt
│ └── bar4 with a space.txt
└── foo3
└── qux1
├── bar5.txt
└── bar6.txt
que eu gostaria de simplificar, com um sublinhado entre cada nível de pasta:
├── foo1_bar1.txt
├── foo1_bar2.txt
├── foo2_bar3.txt
├── foo2_bar4 with a space.txt
├── foo3_qux1.bar6.txt
└── foo3_qux1_bar5.txt
Eu olhei em volta e não encontrei nenhuma solução que funcione, principalmente porque o meu problema tem duas particularidades: pode haver mais de um nível de pasta dentro da raiz e também porque alguns arquivos podem ter espaços.
Alguma idéia de como fazer isso no bash? Obrigado!
Edit : Executando resposta proposta gleen jackman eu recebo isso:
Existem dois sublinhados para a pasta de primeiro nível. Alguma idéia de como evitar isso ou apenas renomeá-lo para que seja apenas um sublinhado? Obrigado.
fonte
foo1__qux1_bar5.txt
, dois sublinhados no primeiro nível de pasta. Tentei mexer com sua linha do bash, mas nada parecia funcionar. Talvez eu precise adicionar algo?"${file//\//_}"
para"${file//+(/)/_
, e se este for um script,shopt -s extglob
brew install findutils
e, em seguida, usando emgfind
vez defind
. Isso funcionou para mim.Usando a renomeação do perl:
RESULTADO
NOTA
(?<!\.)
para não tocar na primeira./
Eu mantenho os dirs vazios, fique à vontade para:
find . -depth -type d -exec rm {} \;
Existem outras ferramentas com o mesmo nome que podem ou não conseguir fazer isso, portanto, tenha cuidado.
Se você executar o seguinte comando (
GNU
)e você tem um resultado como
e não contendo:
então esta parece ser a ferramenta correta =)
Caso contrário, para torná-lo o padrão (geralmente já é o caso)
Debian
e derivado comoUbuntu
:(substitua
/path/to/rename
pelo caminho do seuperl's rename
comando.Se você não possui esse comando, procure no gerenciador de pacotes para instalá-lo ou manualmente
Por último, mas não menos importante, essa ferramenta foi originalmente escrita por Larry Wall, o pai do Perl.
fonte
-type d -exec rmdir
...?perl-rename
no Arch Linux eprename
em sistemas baseados no Debian.rename
Explicações adicionadascom
pax
...Isso criará um hardlink no diretório atual para todos os arquivos em seus diretórios filhos com um
_
substituto/
. Você pode inspecionar os resultados e remover todos os diretórios filhos com ...... depois de verificar os resultados, é do seu agrado.
fonte
Você pode tentar com o comando abaixo.
O comando acima moverá os arquivos e o diretório permanecerá, podendo ser removido posteriormente.
fonte