Mẹo cấu trúc thư mục home (2023)
(unixdigest.com)Mẹo về cấu trúc thư mục home
- Việc cấu trúc hoặc sắp xếp thư mục thực ra không khác nhiều so với việc cấu trúc hay sắp xếp những thứ khác; điều cốt lõi là làm theo cách hợp lý nhất với bản thân
- Khi xử lý việc tổ chức, mọi thứ có thể rất nhanh chóng trở nên mất kiểm soát
- Mục đích chính của việc sắp xếp là hiệu quả: phải có thể tìm thứ cần tìm một cách dễ dàng và nhanh chóng, đồng thời lưu thứ cần lưu cũng dễ dàng và nhanh chóng
Các tệp và thư mục mặc định bị ẩn
- Trong thư mục home của tôi có đầy đủ các tệp ẩn mặc định vốn là một phần của các hệ điều hành Unix hiện đại như
.config,.aliases,.profile,.gnupg,.mozilla - Tôi muốn mọi ứng dụng đều tôn trọng
XDG_CONFIG_HOME, nhưng cũng không quá can thiệp hay bận tâm về việc đó - Trước đây tôi từng quản lý
$HOMEbằng Git, và đó là một cách rất tốt để tổ chức Dotfiles - Tôi vẫn đưa tất cả Dotfiles vào Git để giữ lịch sử thay đổi, nhưng chỉ giữ nguyên những Dotfiles hoạt động giống nhau trên các hệ thống khác nhau mà tôi sử dụng
- Các Dotfiles theo từng cấu hình được lưu trong thư mục
dotfilesvà dùng symbolic link
Cấu trúc chung cho tệp và thư mục
- Các tệp và thư mục thông thường chủ yếu được tổ chức theo hai cách: "danh mục" và "ngày tháng"
- Cấu trúc thư mục cơ bản:
bindataedatamntusr/dotfiles
- Giữ nguyên các thư mục
DesktopvàDownloads(vì có vẻ hầu hết ứng dụng đều ép dùng chúng) - Thư mục
bindùng để lưu shell script và các tệp thực thi nhị phân cá nhân (không bao gồm những thứ được cài qua trình quản lý gói) - Thư mục
mntđược dùng cho nhiều điểm mount khác nhau như thẻ SD, đĩa USB, bộ nhớ dùng chung trong homelab, v.v. - Tôi tuyệt đối không dùng tự động mount mà sử dụng shell script để mount
- Thư mục
usr/dotfilesđược quản lý bằng Git cùng với các Dotfiles thông thường như.aliases, và sử dụng symbolic link tới các tệp liên quan trong thư mụcdotfiles
Cấu trúc thư mục dữ liệu
- Thư mục
datavàedatalà hai thư mục chính dùng để lưu toàn bộ dữ liệu - Hai thư mục này là các ZFS dataset chạy trên một pool mirror đĩa, tách biệt với cài đặt hệ thống gốc
- Tôi tận dụng ZFS để sao lưu dễ dàng lên bộ nhớ mạng bằng cách thường xuyên dùng snapshot cũng như ZFS send/receive
- Điểm khác biệt giữa
datavàedatalàedatalà ZFS dataset dùng mã hóa gốc mặc định - Mã hóa tốt cho quyền riêng tư, nhưng cũng là một lớp phức tạp khủng khiếp đặt chồng lên một hệ thống phân cấp tệp vốn đã phức tạp, và ZFS encryption vẫn có lỗi
- Tôi đặc biệt khuyến nghị luôn sao lưu dữ liệu quan trọng vào nhiều giải pháp lưu trữ và nhiều địa điểm khác nhau
- Tôi không dùng lưu trữ đám mây cho những thứ quan trọng
Mẹo bổ sung
- Quy tắc cơ bản khi đặt tên tệp và thư mục là chỉ nhìn tên cũng phải dễ dàng nhận ra đó là gì
- Nếu không thể biết tệp nói về gì nếu chưa mở nó ra, thì bạn nên mở ngay và đổi sang một cái tên có ý nghĩa hơn cho lần sau khi nhìn thấy nó
- Nếu để tệp và thư mục bừa bộn mà không sắp xếp, về sau sẽ rất khó chỉnh sửa lại
- Tôi dùng tên tệp có mô tả dài khi cần, để có thể nắm được nội dung tệp mà không cần mở nó ra
Ý kiến của GN⁺
-
Bài viết này đưa ra các mẹo thực tế về cách sắp xếp và tổ chức cấu trúc thư mục. Đặc biệt, cách tận dụng ZFS dataset để chia tách và quản lý thư mục được mã hóa và không mã hóa khá thú vị.
-
Cá nhân tôi nghĩ rằng nên lưu trữ dữ liệu quan trọng dưới dạng mã hóa. Tuy nhiên, vì cũng có những nhược điểm như suy giảm hiệu năng hoặc tăng độ phức tạp do mã hóa gây ra, nên có vẻ tốt hơn nếu sử dụng có chọn lọc tùy theo tình huống.
-
Ngoài ra, tôi cho rằng việc chia sẻ trước cách truy cập dữ liệu đã mã hóa với người thân trong gia đình cũng là một điểm quan trọng. Điều này cần thiết để không làm mất dữ liệu ngay cả khi bản thân không thể truy cập được nữa do tai nạn hay sự cố.
-
Đối với quản lý dữ liệu cá nhân, việc xây dựng một chiến lược sao lưu có hệ thống như tác giả là rất quan trọng. Có thể tuân theo quy tắc sao lưu 3-2-1, nhưng thay vì lưu trữ đám mây thì tận dụng các kho lưu trữ cục bộ phân tán về mặt vật lý cũng có vẻ là một cách hay.
-
Các công cụ mã nguồn mở hữu ích cho việc quản lý dữ liệu cá nhân gồm có Syncthing hoặc Nextcloud. Nếu tận dụng tốt các công cụ này, có thể đạt được việc quản lý dữ liệu cá nhân một cách có hệ thống và an toàn.
1 bình luận
Ý kiến trên Hacker News
Tôi ghét việc thư mục home trở nên bừa bộn, đặc biệt là khi ứng dụng cho rằng chúng phải tạo các thư mục thậm chí không bị ẩn ngay trong home
Điều khiến tôi tức nhất là
~/go, thư mục mặc định của Go modules. Tôi ghét đến mức đã tránh cài ứng dụng Go hay phát triển bằng Go trong nhiều năm, nhưng cuối cùng vẫn phải dùng; dù có thể đổi bằng cách đặtGOPATH, giá trị mặc định vẫn quá tệ.rustup,.mix,.npm,.yarnDù vậy, việc làm ô nhiễm thư mục home như
~/gomà thậm chí không lịch sự ẩn đi thì thật sự rất vô duyênNó quá trái với cách tôi tổ chức dự án, và đó là lý do chính khiến tôi không còn hứng thú với Go. Có thể hợp hơn với những ai thích gom nhiều dự án không liên quan vào một monorepo, nhưng không phải gu của tôi
$HOME.$HOMElà nơi các ứng dụng làm bẩn, còn file của mình thì có thể để ở đúng nghĩa là bất kỳ chỗ nào khác.vimrcvà.gitconfigđược symlink tới một kho Git. Như vậy phần còn lại của thư mục home có hoàn toàn là rác cũng không sao, và nếu máy chết thì có thể khôi phục trên máy khác trong vài phútxdg-ninja đã giúp giảm vấn đề hầu hết ứng dụng xả file vào thư mục home
Tóm lại, nó quét các chương trình đã cài và cho biết có thể cấu hình chúng tuân theo chuẩn XDG hay không. Không hiệu quả với mọi thứ, nhưng nhiều ứng dụng có tùy chọn như vậy
https://github.com/b3nj5m1n/xdg-ninja
Tôi muốn không chỉ sắp xếp, mà còn sao lưu và di chuyển giữa các máy một cách gọn nhẹ
Thư mục
.configlà một vấn đề lớn khi sao lưu có chiến lược, vì các ứng dụng nhét dữ liệu phiên làm việc vài gigabyte vào đó“Dữ liệu phiên” không phải là “cấu hình”. “Cấu hình” của một ứng dụng làm sao có thể lên đến vài gigabyte được
.configphải có thể hoạt động ngay cả khi ở chế độ chỉ đọc.confignhư kho dữ liệu ứng dụng. Đã có.localvà.cachecho mục đích đó rồiChuyện này quá cá nhân, nên giải pháp của tác giả không hữu ích với tôi, và giải pháp của tôi chắc cũng chẳng giúp được mấy cho người khác
Thư mục home của tôi gần như trống. Tất cả file công việc nằm trong OwnCloud, và câu hỏi thật sự là cấu trúc thư mục bên trong OwnCloud như thế nào. Các kho Git cục bộ thì nằm trên một phân vùng hoàn toàn riêng
Giờ KeepassXC xử lý khóa SSH, nên các khóa trong
.sshcũng đã nằm trong file Keepass trên OwnCloud. Mọi thứ đơn giản hơn rất nhiều, và giờ trong thư mục home thật sự hầu như chẳng còn gì đáng để bận tâmSau khi đăng nhập, tôi phải có thể dùng một lệnh để đồng bộ bộ file phù hợp tùy theo môi trường hiện tại là Linux hay không, dùng cho công việc hay cá nhân, desktop hay server
Ví dụ, tôi tuyệt đối không muốn xuất các biến môi trường như endpoint vault ở nhà hoặc một token cụ thể nào đó sang hệ thống công việc
Gần đây tôi đã chuyển sang home-manager của dự án NixOS, và nó trông khá hứa hẹn. Ngôn ngữ Nix phức tạp, nhưng lớp trừu tượng để định nghĩa nhiều môi trường khác nhau chính xác là thứ tôi cần, và có thể tách nội dung file công việc/cá nhân bằng các nhánh Git
.vimrcvà.bashrc/.zshrctrong homeÝ tưởng thì ổn, nhưng tôi không thích cách chia media theo cấu trúc kiểu gia đình. Về sau có vẻ sẽ sinh ra cả đống tệp trùng lặp và các bản trùng đã chỉnh sửa, rồi chúng dễ bị lẫn vào nhau khiến bạn có thể làm mất bản đã chỉnh sửa
Tôi nghĩ ảnh nên được sắp xếp bằng từ khóa EXIF thì hơn. Lưu metadata trong chính bức ảnh, có thể là trong MIME type, rồi nếu liên quan đến gia đình thì gắn tag như
#familyhoặc#personx. Vì vậy ảnh cứ để trong các thư mục kiểu theo ngày, còn phần còn lại thì dùng chương trình như Adobe Bridge để chỉnh sửa từ khóaVới cấu trúc tên tệp tài liệu, tôi đã thử cả
Date then Description.txtlẫnKeyword Title or Description and then Date.txt. Ngày thì dùng ngày ISO theo định dạngYYYY-MM-DD-hhmmđể tiện sắp xếp, trong đó-hhmmlà tùy chọnCó lúc tôi muốn sắp xếp theo chủ đề, tức từ khóa hoặc tiêu đề, nhưng khi thời điểm ghi lại quan trọng hơn, như log chẳng hạn, thì nên đặt ngày ở đầu
Có thể trông như không cần thiết vì ngày cũng được lưu trong hệ thống, nhưng khi di chuyển tệp thì ngày cuối cùng cũng sẽ thay đổi, và nếu sơ suất thì càng dễ bị đổi hơn. Còn ngày trong tên tệp thì không đổi, và cũng giúp sắp xếp danh sách
photoprism và photostructure có vẻ không quá quan tâm đến cấu trúc thư mục hay cách sắp xếp, nhưng paperless (và các biến thể mới như paperless-ngx) thì nổi tiếng là rất cố chấp về cách sắp xếp và không muốn tôn trọng cấu trúc hiện có
Có một thời gian tôi dùng camlistore/perkeep cho ảnh, nhưng Google Photos có một năng lực áp đảo: nhận ra ai có mặt trong mọi bức ảnh, thậm chí còn tính đến cả chênh lệch tuổi. Hai con trai của tôi cách nhau 8 tuổi, ở cùng tầm tuổi thì trông thật sự rất giống nhau, vậy mà nó vẫn phân biệt chính xác ai là ai. Tôi không biết nó dùng phân tích khuôn mặt hay metadata của ảnh, nhưng chưa lần nào nhầm. Có điều không có cách hợp lý nào để lấy thông tin tag đó ra khỏi Google Photos, dù tôi đang trả tiền
Có lẽ đã đến lúc xem lại. Tôi không nhớ photostructure hay photoprism có thử nhận diện khuôn mặt hay không, nhưng dù hiện chưa làm thì có lẽ chúng sẽ sớm đạt mức gần giống Google Photos, hoặc ít nhất đủ tốt để cắt phụ thuộc vào Google
Tài liệu và ảnh/video thì tạm vậy, còn âm nhạc thì sao? Dù tốt hay xấu, đã ít nhất khoảng 10 năm tôi không trực tiếp quản lý bộ sưu tập nhạc dưới dạng tệp nữa. Dạo này có hệ thống thư viện nào dành cho nhạc được tích hợp sâu hơn với nội dung, thay vì chỉ là “tệp trên đĩa” đơn giản như paperless hay photoprism không?
Cách của tôi là thế này
Các mục liên quan đến GUI thì để chữ hoa, còn các mục liên quan đến CLI thì để chữ thường. Tôi thích kiểu
~/documentshơn, nhưng vì người dùng GUI cứ khăng khăng dùng chữ hoa nên tôi chấp nhận. Hầu như không có việc gì phải trộn hai bên, nên cũng không thành vấn đề lớn~/dotfileslà thư mục dotfile do Git quản lý. Tôi tạo liên kết tượng trưng kiểu~/.zshrc -> dotfiles/zshrc. Không dùng phần mềm quản lý riêng, chỉ tạo link thôi. Trước đây tôi dùng~/.dotfiles, nhưng tôi nghĩ để nó hiện ra thì hợp lý hơn~/projectslà thư mục dự án.~/projects/testlà dự án thử nghiệm dùng một lần để kiểm tra,~/projects/mylà dự án cá nhân,~/projects/companylà dự án của công ty hiện tại tôi đang làm. Có lúc tôi làm với nhiều công ty kiểu gần như freelance, nên cần tách riêng~/tmplà thư mục cho mọi việc dùng một lần. Tôi có một shell function tênmkcdtmp, nó tạo thư mục theo ngày hiện tại như~/tmp/240419rồi chuyển vào đó. Cách này thật sự rất tốt. Tôi thích mua ổ đĩa lớn và để rác lại ở trạng thái có tổ chức phần nào, nên gần như không dọn. Nếu cần thứ gì đó của hôm qua hay tháng trước, tôi biết nó ở đâu; đây là việc giúp ích nhiều nhất cho việc sắp xếp công việc tạm. Nếu cần thì cũng có thể tạo~/tmp/whatever, dù sao tất cả đều là đồ bỏ điTôi không dùng
~/Desktop.~/Documentscũng gần như không dùng và vẫn cần tìm cách sắp xếp. Những thứ như ghi chú ngắn thì tôi ném vào repo GitHub dùng để build website cá nhân. Tôi đã thử nhiều ứng dụng ghi chú, nhưng một website bình thường viết bằng Markdown là hợp nhất với tôiTôi chưa từng thành công trong việc sắp xếp công việc thật có cấu trúc. Lúc nào cũng có đống rác lăn lóc rồi cuối cùng thành thứ gì đó dùng được, nên thay vì chiến đấu với bản thân, tôi quyết định biến đống rác đó thành rác có tổ chức
Về bản chất, máy tính của tôi là vật tiêu hao. Mọi thứ trong
~/projectsđều nằm trên Git, còn~/tmpgần như là cache không mấy quan trọng hoặc công việc bỏ đi. Tôi cố sắp xếp sao cho việc khôi phục từ trạng thái sạch không mất nhiều thời gian. Tôi thường xuyên cài lại OS từ đầu, cũng hay đổi hệ điều hành và laptop; cách này hợp với tôi nhấtMột trong những điều tôi rất không hài lòng ở hệ thống tệp là có quá nhiều thư mục bắt đầu bằng D
Desktop, Dev, Downloads, Documents, Dropbox, v.v.
Tôi từng nghĩ có nên đổi gì đó không, nhưng như tác giả nói, nhiều ứng dụng khá cố chấp về vấn đề này
/srcTôi dùng một cấu trúc khá đơn giản nhưng hợp với mình
Bên dưới
projects/, tôi tạo các thư mục theo năm như2023/,2024/, và mỗi dự án được thêm tiền tố tháng+ngày như0000-something/,0312-other-project/,0419-hn-comment/Mỗi năm tạo một thư mục năm, và khi muốn đẩy các dự án dài hạn lên trên thì thêm
0000hoặc chỉ để phần ngày là00Đơn giản và chạy được trên mọi OS. Trên Linux thì tôi có dùng thêm một chút script phụ trợ
Việc nhanh chóng tạo thư mục để chuyển file từ thư mục Downloads sang cũng dễ, và nếu giữ mức lồng nhau chỉ một cấp thì dễ tìm. Tôi thấy cách này tốt hơn kiểu có thêm một cấp tháng như mẫu
YYYY/MM/DDỞ thư mục cấp cao nhất, tôi thường để những thứ đang làm hiện tại. Kiểu như khái niệm “hôm nay” hoặc “tuần này”
Khi lưu trữ ra ngoài khung thời gian đó, chẳng hạn nếu là hôm nay thì tôi tạo một thư mục theo dạng
041924, rồi chuyển tất cả file tạo trong ngày đó vào đóThường thì xét theo tuổi thọ con người, tôi không thấy cần dùng chuỗi như
2024. Chắc tôi cũng không sống đến năm 2100, còn trước năm 2000 thì không liên quan, nên24là đủThời gian cứ trôi nên số thư mục lưu trữ sẽ tăng lên, nhưng chúng nhỏ và dễ tìm. Cách này đặc biệt hợp nếu mỗi ngày bạn tạo ra những file tiêu chuẩn không mấy độc nhất
projects/ | 01.01.2017something/ | 01.01.2024other-project/ | 01.01.2023hn-comment/ | 01.01.2022Về sao lưu, từng có lần tôi định cài một máy Mac mới từ bản sao lưu Time Machine, nhưng máy Mac lại không nhìn thấy bất cứ thứ gì trong bản sao lưu Time Machine
Khi liên hệ hỗ trợ Apple, tôi được nghe rằng có một lỗi hiếm gặp: trong quá trình cài đặt, đôi khi thay vì cài từ bản sao lưu, nó lại khởi tạo lại bản sao lưu Time Machine
May là tôi đã thiết lập Backblaze nên thoát nạn, nhưng việc khôi phục hàng trăm gigabyte mất cực kỳ lâu
Giờ tôi dùng cả Time Machine, Backblaze và sao lưu iCloud, thỉnh thoảng còn đóng gói toàn bộ thành
.tgzrồi tải lên S3Về chuyện dùng dấu gạch nối hay dấu gạch dưới trong tên file và tên thư mục, tôi hoàn toàn đồng ý với dấu gạch nối
Dùng dấu gạch nối khi di chuyển trong terminal quá thực dụng, đến mức tôi nghĩ nó nên trở thành chuẩn. Tốt hơn nhiều so với việc lần nào cũng phải nhập thêm để chọn tên file có dấu gạch dưới, hoặc phải xử lý khoảng trắng
foo-bar-baz, và khi gõ không cần nhấn Shift