Desejo ocultar arquivos no Linux sem usar o ponto, pois é possível no Windows.
Existe uma maneira de fazer isso?
Desejo ocultar arquivos no Linux sem usar o ponto, pois é possível no Windows.
Existe uma maneira de fazer isso?
Respostas:
Você não pode. Há uma diferença fundamental na maneira como os sistemas de arquivos lidam com as configurações ocultas. No Windows, o sistema de arquivos armazena vários atributos para o arquivo em metadados, incluindo os atributos "oculto" e "sistema" (ambos tipos de arquivos ocultos). Nos sistemas de arquivos * nix comuns, nenhum atributo é armazenado. Em vez disso, as informações devem ser colocadas em outro lugar, como no nome do arquivo. A convenção é assim que os arquivos começam com. (e dependendo do seu sistema, talvez outros como _) não sejam mostrados pela maioria das ferramentas por padrão.
Isto é puramente por conveniência, a. iniciar um nome de arquivo significa absolutamente nada, mas "o usuário provavelmente não deseja ver isso o tempo todo". Para se certificar de que você sabe, a execução de eg ls -a
mostrará todos os arquivos.
Se você não deseja que um arquivo perturbe suas listagens no Linux, renomeie-o para começar com um ponto (bônus: isso também funcionará no OS X, se estivermos falando de um dispositivo portátil). Se você não deseja que os usuários encontrem um arquivo, está fazendo errado - é para isso que servem as permissões.
As permissões Unix, pois pertencem aos diretórios, freqüentemente confundem as pessoas, e talvez entendê-las melhor o ajude. As permissões "ler" e "executar" ( r
e x
) significam algo diferente para diretórios do que para arquivos. Para diretórios, a x
permissão de execução determina se você acessa ou não os inodes no diretório. A r
permissão de leitura determina se você pode ou não acessar a listagem do diretório. Funcionalmente, x
permite que o usuário faça coisas em um diretório, enquanto a r
permissão permite que ele veja o que está nele. São diferentes e a diferença pode ser confusa. Vejamos um exemplo:
jeanluc@login64: ~ $ mkdir example
jeanluc@login64: ~ $ echo "you can read it" > example/file
jeanluc@login64: ~ $ ls example/
file
jeanluc@login64: ~ $ cat example/file
you can read it
jeanluc@login64: ~ $ chmod -x example/
jeanluc@login64: ~ $ ls example/
ls: cannot access example/file: Permission denied
file
jeanluc@login64: ~ $ cat example/file
cat: example/file: Permission denied
jeanluc@login64: ~ $ cd example/
-bash: cd: example/: Permission denied
jeanluc@login64: ~ $ chmod +x example/
jeanluc@login64: ~ $ chmod -r example/
jeanluc@login64: ~ $ ls example/
ls: cannot open directory example/: Permission denied
jeanluc@login64: ~ $ cat example/file
you can read it
jeanluc@login64: ~ $ cd example/
jeanluc@login64: ~/example $ ls
ls: cannot open directory .: Permission denied
jeanluc@login64: ~/example $ cd ..
Portanto, observe que, sem executar, ainda posso listar os arquivos (embora ls mostre um erro porque não é possível obter as propriedades do arquivo), mas não consigo mudar para o diretório ou ler os arquivos nele. Sem a leitura, não consigo listar os arquivos, mas ainda posso mudar para o diretório e, se souber o nome de um arquivo, ainda posso acessá-lo.
Observe, no entanto, que a remoção da permissão de leitura apenas oferece segurança pela obscuridade. Se o usuário adivinhar o nome do arquivo, ele poderá ler seu conteúdo.
Isso pode não ter sido realmente relevante para sua pergunta. Eu só queria ter certeza de que você entendeu as permissões de diretório.
Crie um arquivo .hidden
no diretório com os nomes dos arquivos a serem ocultos (um nome em cada linha).
Em seguida, adicione o seguinte ao seu ~/.bashrc
:
ls () {
if [ -f .hidden ]; then
declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
ls "$@"
fi
}
Agora seu ls
comando não lista esses arquivos.
Eu uso essa técnica para ocultar meus arquivos __pycache__
e __init__.py
.
EDIT: como em outro comentário, isso também os oculta em pelo menos um (Nautilus), mas provavelmente em vários navegadores de arquivos da GUI também.
ls -al
?
Você pode realmente ocultar arquivos no Linux sem adicionar um ponto. Isso realmente os esconde no Nautilus; um ls
da linha de comando ainda listará os arquivos.
.hidden
na pasta em que deseja ocultar os arquivos.ls
listas.
Você está apenas tentando ocultar arquivos do gerenciador de arquivos e / ou do ambiente de trabalho da interface gráfica do usuário? Nesse caso, pode haver opções além de simplesmente prefixar o nome do arquivo com um ponto.
Eu acredito que os arquivos somente adicionais escondidos por qualquer gerenciador de arquivos Linux são arquivos de backup, ou seja, aqueles que terminam em um til ~
ou .bak
ou o que eles acreditam que é a extensão do backup. De qualquer forma, você provavelmente está com sorte se tudo o que você deseja fazer é ocultar os arquivos de backup do gerenciador de arquivos.
Não dê aos seus arquivos uma extensão de backup para ocultá-los ou eles poderão ser excluídos acidentalmente !!
Além disso, você pode ocultar arquivos do Finder no Mac OS X usando o comando SetFile -a V [file]
ou a edição, /.hidden
mas obviamente isso não oculta o arquivo do ls
programa da linha de comando .
chflags hidden filename
.
Se você possui algumas habilidades de programação e se apenas o que precisa é ocultar nomes de arquivos para que o usuário possa parar de bagunçar o espaço visual, é possível invadi-lo!
Considerarei apenas as ferramentas de linha de comando, pois elas são bastante uniformes e são as únicas ferramentas constantemente usadas sou eu.
Existem várias maneiras de armazenar essas informações:
Você pode armazenar o atributo estendido "oculto" nos arquivos selecionados. Vejoman attr
attr -s hidden -V true your_file
Ou, como mencionado acima, você pode armazenar a lista de nomes de arquivos no .hidden
arquivo
Importante: Isso não funcionará imediatamente, você precisará implementar a lógica; os sistemas limpos apenas ignoram os .hidden
arquivos e os hidden
atributos estendidos!
Também existem várias implementações possíveis:
Se você tiver apenas alguns arquivos, escreva no seu .bashrc
arquivo
alias ls='ls -I filename_1 -I filename_2'
man ls
Para maiores informações.
Escreva um documento function ls
como ele lide com toda a lógica por trás do reconhecimento de arquivos ocultos e lista de montagem de todas as -I
entradas e, em seguida, execute
/bin/ls
com os sinalizadores de ignorar apropriados. Tarefa muito trabalhosa, porque você precisa lidar com todos os ls
parâmetros corretamente.
Obter fontes de coreutils
git clone git://git.sv.gnu.org/coreutils
ou
git clone git://git.suckless.org/sbase
Faça o patch da maneira que você precisa para lidar com a implementação de arquivos ocultos. E coloque-o no seuPATH
Eu o cortei em menos de 5 minutos usando fontes sem sugador e o diff é assim:
diff --git a/ls.c b/ls.c
index cdfce4d..8197409 100644
--- a/ls.c
+++ b/ls.c
@@ -214,6 +214,17 @@ lsdir(const char *path)
first = 0;
while ((d = readdir(dp))) {
+///////////////////////////////////////////////
+// Dirty hack to implement hidden files
+// FIXME: Make proper(!) subroutine
+ char attr_command[1024] = "attr -Lqg hidden "; // Oh, dear. That's bad
+ int attr_code;
+ strcat(attr_command, d->d_name);
+ strcat(attr_command, " >/dev/null 2>&1");
+ attr_code = system(attr_command);
+ if (!attr_code)
+ continue;
+///////////////////////////////////////////////
if (d->d_name[0] == '.' && !aflag && !Aflag)
continue;
else if (Aflag)
ls.c
mentiras em src
, não o diretório raiz, e não há nenhuma função lsdir
no ls.c
.
Esta é a melhor solução que encontrei, adicione ao seu perfil :
alias ls="/bin/ls --color=auto --ignore='*.egg-info' --ignore='__pycache__'"
Se você precisar de mais padrões, basta adicionar mais --ignore
sinalizadores.
Atualmente você pode escrever o FUSE que oculta arquivos de acordo com a configuração especificada.
Este artigo me faz acreditar que você precisa ajustar a getdir
função:
getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Isso lê o conteúdo de um diretório. Esta operação é aopendir()
,readdir()
...,closedir()
seqüência em uma chamada. Para cada entrada de diretório, afilldir()
função deve ser chamada.
Não sou programador, mas imagino que se possa getdir
omitir todos os arquivos listados no .hidden
arquivo (por exemplo) . Se você implementar isso corretamente, todas as ferramentas (GUI ou não) serão afetadas.
Você pode 'esconder' o conteúdo de um diretório por tirar perms 'x' para o grupo, ou outro: chmod go-x directoryname
. Você não podia mais listar arquivos, embora pudesse acessar um arquivo se soubesse o caminho exato. Isso não soa como o que você deseja.
Lembre-se de que o arquivo dotfile é uma conveniência, não realmente para ocultar o arquivo por motivos de segurança, mas para reduzir a confusão de arquivos durante a listagem de arquivos. Está cozido ls
e as outras ferramentas.