如何在不重新创建文件夹的情况下重置文件夹元数据大小?

如何在不重新创建文件夹的情况下重置文件夹元数据大小?

我有一个文件夹 ( watch),其中错误地填充了大量临时文件。我已经清除了所有这些文件,但该文件夹的大小仍然是 356 kB。过去,我将文件夹移开,创建一个同名的新文件夹,并将所有文件复制到其中,以使其恢复到以前的小尺寸。有什么方法可以让它恢复到较小的大小而不重新创建文件夹吗?

drwxr-xr-x 2 apache apache   4096 Nov 29  2014 details
drwxr-xr-x 2 apache apache 364544 Jan 21 17:24 watch
drwxr-xr-x 3 apache apache   4096 Jan 21 17:19 settings

watch有两个小文件:.htaccess 和index.php。

我有一个 ext4 文件系统。

答案1

e4fsck支持-D似乎可以做你想做的事情的标志:

尝试优化所有目录,如果文件系统支持目录索引,则通过重新索引它们,或者通过对较小目录或使用传统线性目录的文件系统进行排序和压缩目录。

当然,您需要卸载文件系统才能使用fsck,这意味着您的服务器会停机。

您将需要使用该-f选项来确保e4fsck处理文件系统,即使文件系统是干净的。

测试:

# truncate -s1G a; mkfs.ext4 -q ./a; mount ./a /mnt/1
# mkdir /mnt/1/x; touch /mnt/1/x/{1..4000}
# ls -ld /mnt/1/x
drwxr-xr-x 2 root root 69632 Nov 22 12:54 /mnt/1/x/
# rm -f /mnt/1/x/*
# ls -ld /mnt/1/x
drwxr-xr-x 2 root root 69632 Nov 22 12:55 /mnt/1/x/
# umount /mnt/1
# e2fsck -f -D ./a
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 3A: Optimizing directories
Pass 4: Checking reference counts
Pass 5: Checking group summary information

./a: ***** FILE SYSTEM WAS MODIFIED *****
./a: 12/65536 files (0.0% non-contiguous), 12956/262144 blocks
# mount ./a /mnt/1
# ls -ld /mnt/1/x
drwxr-xr-x 2 root root 4096 Nov 22 12:55 /mnt/1/x/

答案2

您的问题的答案是出于所有实际目的。 ext4 不会截断目录,因此您需要重新创建它们。您可以通过移动而不是将文件复制到新目录来改进以前的技术,这可能会快得多,并且只会改变文件的 ctime。

如果没有子目录,您甚至可以使用将ln文件硬链接到新目录。

Linux 有一个renameat2系统调用,可用于交换两个名称,因此再次假设您没有子目录,您可以创建新目录,将文件从旧目录链接到新目录,然后交换新旧目录。谷歌很快就想出了https://gist.github.com/eatnumber1/f97ac7dad7b1f5a9721f作为调用 renameat2 的示例代码。

当然,一切都只是数据,因此您可以使用类似的东西debugfs,甚至dd可以直接在磁盘上编辑数据结构。我不建议为了 360KB 的空间而走这条路。

答案3

使用vim您可以“编辑”目录。删除除 之外的所有内容./../应“重置”文件夹元数据

我的下载目录是12k

vim Downloads/

" ============================================================================                                                                                                                                            
" Netrw Directory Listing                                        (netrw v150)
"   /home/harry/Downloads
"   Sorted by      name
"   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:exec
" ============================================================================
../
./
Documents/
LeapDeveloperKit_2.3.1+31549_linux/
Leap_Motion_Installer_Packages_release_public_linux/
Moderncv Casual/
OneDrive-2015-11-24/
Resume/
g13-gui/
jpegs/
markdown-notes-linux-x64/
pebble_js_tutorial_1_1/
pios/
teamviewerqs/
xampp-linux-x64-5.6.14-4-installer.run*
.swo
1452760968416.jpg
1a412bb33cb0a60077579b8bc13b2237.log.gz
....

这是一个常见的 4k 目录的示例 vim Videos/

" ============================================================================                                                                                                                                       
" Netrw Directory Listing                                        (netrw v150)
"   /home/harry/Videos
"   Sorted by      name
"   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:exec
"  ============================================================================
../
./
EnVyUs vs NiP, Mirage - FACEIT Stage 3 Finals at Dreamhack Winter - Group B-O3pBF-3KmzM.mp4
The Tek 0201 - Is USA Like Nazi Germany-zrOo8LzvKvc.mp4
The Tek 0203 - YT Red, EU Net Neutrality Trouble, Drones Taking  Jobs-IEdUcjBGyEw.mp4.part
The Tek 0204 - Logan's Favorite Episode of the Year-iga7kB1NhKY.mp4
VP vs TSM, Mirage - FACEIT Stage 3 Finals at Dreamhack Winter - Group A Winners Match-3jfepl5Of0o.mp4
.swp

我对此事的理解是,Linux(或 *Nix)下的目录只是“特殊”文件,可以存储有关位于其“下方”的文件的信息。我发现在我的系统上只能vim做到这一点,使用nano或其他人只是显示一个空白文件,我猜它读取内容的方式不同

这是一个很好的 stackexchange 问题,它回答了 Linux 下的文件夹(目录)是什么 Unix 文件系统中的目录是如何实现的?

相关内容