Истинное содержимое каталога в *nix-системе

Вариант простой петли оболочки (вbash):

shopt -s extglob dotglob nullglob

for pathname in ~username/data/!(*.txt); do
    ! test -d "$pathname" && mv "$pathname" ~username/data/other_files
done

Параметры оболочки, установленные в первой строке, заставят оболочку bashвключить расширенные шаблоны подстановок(!(*.txt)для соответствия всем именам, не заканчивающимся на .txt), это позволяет шаблонам подстановок соответствовать скрытым именам, и это делает шаблон расширяться до нуля, если ничего не совпадает.

Тело цикла пропустит все, что является каталогом (или символической ссылкой на каталог ), и переместит все остальное в заданный каталог.

Эквивалентная вещь с findи GNUmv(будет перемещать символические ссылки на каталоги, если они есть, и вызывать mvдля максимально возможного количества файлов одновременно, но это единственные различия ):

. ]

find ~username/data -maxdepth 1 ! -type d ! -name '*.txt' \
    -exec mv -t ~username/data/other_files {} +

Связанные:

0
25.02.2021, 14:34
1 ответ

Is the true form of a Unix directory essentially just a file that consists of (column 1) inode numbers and (column 2) a string indicating the name of the file/directory corresponding to that inode number?

По крайней мере концептуально, да. Однако фактический формат диска -может отличаться.

Хотя, насколько мне известно, многие файловые системы (, такие как ext4 ), обрабатывают каталоги как файлы так же, как их область хранения зарезервирована таким же образом. (За исключением того, что каталоги ext4 не могут уменьшаться в размере. )Каталог также должен иметь собственный индексный дескриптор для хранения дат изменений, разрешений и т. д. Но то, что находится внутри области данных каталога, отличается. «Классический» формат представляет собой просто список записей {name, inode} (с некоторыми незначительными учетными данными, такими как длина пространства, зарезервированного для имени ), но также используются более сложные структуры данных (деревья ). использовал. Для ext4 см.:https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Directory_Entries

Также обратите внимание, что в зависимости от файловой системы запись каталога может также содержать тип указанного -индексного дескриптора. Это может быть полезно в качестве оптимизации, если вам нужен только тип, нет необходимости делать отдельный системный вызов для stat()записи. Кроме того, тип индексного дескриптора не меняется в течение всего времени существования индексного дескриптора, поэтому нет проблем с синхронизацией нескольких записей каталога, как если бы изменяемые данные индексного дескриптора были перемещены в direntry.

2
18.03.2021, 22:28

Теги

Похожие вопросы