Transformar um diretório em arquivo ou um arquivo em diretório

15

Eu queria criar um arquivo chamado test. Acidentalmente eu corro em mkdir testvez de touch test.

É possível converter o testdiretório em um arquivo chamado test?

Que tal converter um arquivo nomeado testem um diretório com o mesmo nome?

Ionică Bizău
fonte
5
rm -f test && touch testExceto isso, eu realmente não sei
kiwy
@ Kiwy Sim, mas estou imaginando um comando interno projetado para executar esta tarefa.
Jonic Biz

Respostas:

12

Isso não é possível para qualquer Unix ou Linux que eu já toquei.

Sob alguns Unixes mais antigos, diretórios são arquivos, especialmente marcados, mas ainda arquivos. Você costumava ler um diretório catno SunOS, por exemplo. Muitos sistemas de arquivos modernos podem ter diretórios como árvores B + ou alguma outra estrutura de dados em disco. Portanto, transformar um arquivo em um diretório ou vice-versa sempre exigiria uma exclusão e uma recriação com o mesmo nome.

Bruce Ediger
fonte
1
Interessante. Se ninguém vier com uma solução, marcarei esta resposta. :-)
Ionică Bizău
5

Não existe tal comando, porque não haveria absolutamente nenhum sentido nele. Sua pergunta é como pedir uma maneira de transformar uma caixa em um retângulo plano. O que você faria com as coisas na caixa (diretório)? Como o retângulo corresponderia à caixa de onde veio?

Arquivos e diretórios servem para funções completamente diferentes. Embora um diretório seja de fato um arquivo nos sistemas * nix, isso se aplica apenas às partes internas do sistema e não ao que você, usuário, vê. Portanto, converter um arquivo em um diretório ou vice-versa sempre envolverá a exclusão do arquivo e a criação do diretório. O melhor que você poderia esperar seria usar o mesmo inode, mas novamente, não há muito sentido nisso.

terdon
fonte
Dizer que não faz sentido é sua opinião, não um fato técnico.
Sridhar Sarnobat
@ user7000, o que você faria com o conteúdo de um diretório ao "converter" em um arquivo?
terdon
Um sistema de arquivos armazena dados em uma estrutura em árvore. Na ciência da computação, nós de árvore que são nós de folha podem se tornar nós internos quando você adiciona filhos a eles. E não, não vou usar um banco de dados quando um sistema de arquivos for suficiente.
Sridhar Sarnobat
2

Crie uma função para fazer o que quiser. ( bashou outro Bourne / POSIX como shell assumido)

$ dir2file() { rmdir -- "$1" && touch -- "$1";}
$ mkdir adir
$ dir2file adir
$ ls -l adir
-rw-r--r-- 1 xtian xtian 0 2014-03-04 14:59 adir
$ 

Eu uso deliberadamente o rmdirque falhará se adirnão for um diretório ou não estiver vazio (não -fforçar). touchserá executado apenas se rmdirfor bem-sucedido.

Você pode colocar a definição da função no arquivo de personalização do shell ( .bashrcpara bash).

X Tian
fonte
@Stephane Chazelas O que --faz?
X Tian
2
as --marcas marcam o final dos sinalizadores rmdire, se touchsouberem do passado, é um nome de arquivo, mesmo que comece com -.
Kevin
2

Para aqueles que se perguntam por que você deseja fazer isso, siga este tópico:

https://community.linksys.com/t5/Wireless-Routers/Media-files-changing-to-folder-types/td-p/504192/highlight/true

Aparentemente, um bug no firmware inverteu o bit na entrada de diretório do arquivo, fazendo o sistema operacional pensar que é uma pasta em vez de um arquivo.

Embora eu não tenha o roteador Linksys em questão, algo mudou todos os meus arquivos .jpg em pastas vazias. Se há alguma maneira de mudar o bit (ou o que seja) que diz que uma entrada de diretório NTFS é uma pasta versus um arquivo, eu gostaria de saber sobre isso.

Uma das soluções nesse segmento de dois anos disse que se o disco rígido que contém as pastas que costumavam ser arquivos está conectado a um Mac executando o OS / X, o Mac os verá como arquivos novamente e eles pode ser copiado para uma pasta no Mac. Eu não tenho um Mac para experimentar isso, então se alguém souber uma maneira de virar a página ...

Peter Dow
fonte
1

Em primeiro lugar, ter acesso ao terminal e executar ls -al filecom arquivo sendo o arquivo que você deseja converter de volta para uma pasta real. Se houver arquivos e subdiretórios listados, significa que seu "arquivo" era anteriormente uma pasta com conteúdo real e você pode continuar:

Executar:

sudo chmod 700 /

OU

sudo chmod 700 file

Reinicie o sistema e recupere o acesso ao terminal e execute:

sudo chmod 744 /

OU

sudo chmod 744 file

Lembre-se: "arquivo" deve ser substituído pelo arquivo que você deseja converter novamente em uma pasta REAL.

Essa é apenas uma maneira arbitrária de resolver esse problema, mas cria anomalias de permissão que você pode usar fsck -fpara corrigir (enquanto não está montado, é claro) ou definir manualmente novas permissões, conforme necessário.

Novamente, essa é apenas uma maneira comprovada de evitar a exclusão do arquivo que anteriormente era uma pasta não vazia.

Alex S.
fonte
Abordagem interessante ...
eyoung100