Я хочу скрыть файлы в Linux, не используя точку, так как это возможно в Windows.
Есть ли способ сделать это?
Я хочу скрыть файлы в Linux, не используя точку, так как это возможно в Windows.
Есть ли способ сделать это?
Ответы:
Вы не можете. Существует принципиальная разница в том, как файловые системы обрабатывают скрытые настройки. В Windows файловая система хранит несколько атрибутов для файла в метаданных, включая атрибуты «скрытый» и «системный» (оба из которых являются разновидностями скрытых файлов). В обычных файловых системах * nix такой атрибут не сохраняется. Вместо этого информация должна быть размещена где-то еще, например, в имени файла. Таким образом, условием является то, что файлы начинаются с. (и в зависимости от вашей системы, возможно, некоторые другие, такие как _) не будут отображаться большинством инструментов по умолчанию.
Это чисто для удобства, а. Начало имени файла означает абсолютно ничего, кроме «пользователь, вероятно, не хочет видеть это все время». Чтобы убедиться, что вы знаете, при запуске eg ls -a
будут показаны все файлы.
Если вы не хотите, чтобы файл загромождал ваши списки в Linux, вам следует переименовать его, чтобы начать с точки (Бонус: это будет работать и для OS X, если мы говорим о портативном устройстве). Если вы не хотите, чтобы пользователи могли найти файл, вы делаете это неправильно - для этого нужны разрешения.
Разрешения Unix, поскольку они относятся к каталогам, часто вводят людей в заблуждение, и, возможно, лучшее понимание поможет вам. Разрешения «чтение» и «выполнение» ( r
и x
) означают что-то другое для каталогов, чем для файлов. Для каталогов x
разрешение на выполнение определяет, есть ли у вас доступ к inode в каталоге. Разрешение на чтение r
определяет, можете ли вы получить доступ к списку каталогов. Функционально, x
позволяет пользователю делать вещи в каталоге, в то время как r
разрешение позволяет им видеть, что в нем. Они разные, и разница может сбивать с толку. Давайте посмотрим на пример:
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 ..
Итак, обратите внимание, что без execute я все еще могу перечислить файлы (хотя ls показывает ошибку, потому что не может получить свойства файла), но я не могу перейти в каталог или прочитать файлы в нем. Без чтения я не могу перечислить файлы, но я все еще могу перейти в каталог, и если я знаю имя файла, я все равно могу получить к нему доступ.
Однако обратите внимание, что удаление разрешения на чтение дает вам безопасность только по незаметности. Если пользователь угадает имя файла, он сможет прочитать его содержимое.
Возможно, это не имело отношения к вашему вопросу, я просто хотел убедиться, что вы понимаете права доступа к каталогу.
Создайте файл .hidden
в каталоге с именами файлов, которые будут скрыты (по одному имени в каждой строке).
Затем добавьте следующее к вашему ~/.bashrc
:
ls () {
if [ -f .hidden ]; then
declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
ls "$@"
fi
}
Теперь ваша ls
команда не перечисляет эти файлы.
Я использую эту технику, чтобы скрыть мои __pycache__
и __init__.py
файлы.
РЕДАКТИРОВАТЬ: согласно другому комментарию это также скрывает их, по крайней мере, в одном (Nautilus), но, вероятно, в нескольких браузерах файлов GUI.
ls -al
?
На самом деле вы можете скрыть файлы в Linux без добавления точки. Это на самом деле скрывает их в Наутилусе; ls
из командной строки будет еще список файлов.
.hidden
в папке, где вы хотите скрыть файлы.ls
списках.
Вы только пытаетесь скрыть файлы из файлового менеджера и / или рабочего стола вашего графического интерфейса пользователя? Если это так, возможны варианты помимо простого добавления префикса к имени файла с точкой.
Я считаю , что только дополнительные файлы , скрытые любого файлового менеджера Linux являются создание резервных копий файлов, то есть те , оканчивающиеся на тильды ~
или .bak
или то , что они считают , является расширение резервного копирования. В любом случае вам, вероятно, повезет, если все, что вы хотите сделать, это скрыть файлы резервных копий из файлового менеджера.
Не давайте своим файлам расширение для резервного копирования, чтобы скрыть их, иначе они могут быть случайно удалены !!
Кроме того, вы можете скрыть файлы из Finder в Mac OS X с помощью команды SetFile -a V [file]
или редактирования, /.hidden
но, очевидно, это не скроет файл из программы командной строки ls
.
chflags hidden filename
.
Если у вас есть некоторые навыки программирования, и если вам нужно только скрыть имена файлов для удобства пользователей, чтобы не загромождать визуальное пространство, вы можете взломать его!
Я рассмотрю только инструменты командной строки, так как они довольно единообразны и являются единственными инструментами, которые постоянно используются мной.
Есть много способов хранить эту информацию:
Вы можете хранить «скрытый» расширенный атрибут в выбранных файлах. Видетьman attr
attr -s hidden -V true your_file
Или, как упоминалось выше, вы можете сохранить список имен файлов в .hidden
файле
Важно: это не сработает сразу после установки логики, чистые системы будут просто игнорировать .hidden
файлы и hidden
расширенные атрибуты!
Также есть несколько возможных реализаций:
Если у вас есть только несколько файлов, напишите в своем .bashrc
файле
alias ls='ls -I filename_1 -I filename_2'
man ls
за дополнительной информацией.
Напишите function ls
такой, как он обрабатывает всю логику, стоящую за распознаванием скрытых файлов и сборкой списка всех -I
записей, а затем выполняя
/bin/ls
с соответствующими флагами игнорирования. Очень трудоемкая задача, потому что вы должны правильно обрабатывать все ls
параметры.
Получить источники coreutils
git clone git://git.sv.gnu.org/coreutils
или
git clone git://git.suckless.org/sbase
Исправьте это так, как вам нужно для реализации скрытых файлов. И поместите это в свойPATH
Я взломал его менее чем за 5 минут, используя бесполезные источники, и diff выглядит так:
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
лежит src
не в корневом каталоге, а lsdir
в ls.c
.
Это лучшее решение, которое я нашел, добавьте в свой профиль :
alias ls="/bin/ls --color=auto --ignore='*.egg-info' --ignore='__pycache__'"
Если вам нужно больше шаблонов, просто добавьте больше --ignore
флагов.
В настоящее время вы можете написать FUSE, который скрывает файлы в соответствии с заданным конфигом.
Эта статья заставляет меня поверить, что вам нужно настроить getdir
функцию:
getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Это читает содержимое каталога. Эта операцияopendir()
,readdir()
...,closedir()
в одном вызове. Для каждой записи каталогаfilldir()
должна быть вызвана функция.
Я не программист, но я думаю, что можно было бы getdir
опустить все файлы, перечисленные в (например) .hidden
файле. Если вы реализуете это правильно, то будут затронуты все инструменты (GUI или нет).
Вы можете «скрыть» содержимое директории, убирая «х» завивку для группы, или другой: chmod go-x directoryname
. Вы больше не можете перечислять файлы, но можете получить доступ к файлу, если знаете точный путь. Это не похоже на то, что вы хотите.
Имейте в виду, что функция dotfile - это удобство, которое заключается не в том, чтобы скрывать файл ради безопасности, а в том, чтобы уменьшить беспорядок для файлов во время листинга. Он запекается ls
и другими инструментами.