Я хочу приховати файли в Linux без використання крапки, оскільки це можливо в Windows.
Чи є спосіб це зробити?
Я хочу приховати файли в Linux без використання крапки, оскільки це можливо в Windows.
Чи є спосіб це зробити?
Відповіді:
Ви не можете. Існує принципова різниця в тому, як файлові системи обробляють приховані налаштування. У Windows файлова система зберігає кілька атрибутів для файлу в метаданих, включаючи атрибути "прихований" та "системний" (обидва - це види прихованих файлів). У загальних файлових системах * nix такий атрибут не зберігається. Натомість інформацію потрібно помістити десь в іншому місці, наприклад, у назві файлу. Таким чином, це умова, що файли, що починаються з. (і залежно від вашої системи, можливо, деякі інші, як-то _) більшість інструментів за замовчуванням не відображатимуться.
Це виключно для зручності, a. починати ім'я файлу не означає абсолютно нічого, але "користувач, ймовірно, не хоче бачити це весь час". Щоб переконатися, що ви знаєте, запуск, наприклад ls -a
, покаже всі файли.
Якщо ви не хочете, щоб файл переповнював ваші списки в Linux, вам слід перейменувати його, щоб почати з крапки (бонус: це буде працювати і для OS X, якщо ми говоримо про портативний пристрій). Якщо ви не хочете, щоб користувачі мали змогу знайти файл, ви робите це неправильно - саме для цього є дозволи.
Дозволи на Unix, оскільки вони стосуються каталогів, часто бентежать людей, і, можливо, краще зрозуміти це допоможе вам. Дозволи «читання» і «виконати» ( r
і x
) середнє що - то інше для каталогів , ніж вони роблять для файлів. Для каталогів x
дозвіл на виконання визначає, чи отримуєте ви доступ до входів у каталозі чи ні. 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 ..
Отже, зауважте, що без виконання я все ще можу перерахувати файли (хоча ls показує помилку, оскільки вона не може отримати властивості файлу), але я не можу перейти до каталогу чи прочитати файли в ньому. Без читання я не можу перерахувати файли, але все одно можу змінитись у каталозі, і якщо я знаю ім'я файлу, я все одно можу отримати доступ до нього.
Однак зауважте, що видалення дозволу на читання дає вам лише захист. Якщо користувач здогадається назву файлу, він зможе прочитати його вміст.
Це, можливо, не стосувалося вашого питання, я просто хотів переконатися, що ви зрозуміли дозволи довідників.
Створіть .hidden
у каталозі файл із іменами файлів, які слід приховати (по одному імені в кожному рядку).
Потім додайте до свого ~/.bashrc
:
ls () {
if [ -f .hidden ]; then
declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
ls "$@"
fi
}
Тепер ваша ls
команда не перераховує ці файли.
Я використовую цю техніку, щоб приховати свої файли __pycache__
та __init__.py
файли.
EDIT: за іншими коментарями, це також приховує їх принаймні в одному (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
параметри.
Отримайте джерела основних елементів
git clone git://git.sv.gnu.org/coreutils
або
git clone git://git.suckless.org/sbase
Виправте це так, як вам потрібно обробити реалізацію прихованих файлів. І помістіть його у своєPATH
Я зламав його менше, ніж за 5 хвилин, використовуючи безлітні джерела, і різниця така:
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
і в інших інструментах.