Преобразуйте каталог в файл или файл в каталог


15

Я хотел создать файл с именем test. Случайно бегаю mkdir testвместо touch test.

Можно ли конвертировать testкаталог в файл с именем test?

Как насчет преобразования файла с именем testв каталог с таким же именем?


5
rm -f test && touch testкроме этого, я действительно не знаю
— Kiwy

@Kiwy Да, но я представляю себе встроенную команду, предназначенную для выполнения этой задачи.
— Ионика Бизэу

Ответы:


12

Это невозможно для любого Unix или Linux, к которому я когда-либо прикасался.

В некоторых старых версиях Unix каталоги - это файлы, специально помеченные, но все же файлы. catНапример, раньше вы могли читать каталог с помощью SunOS. Многие современные файловые системы могут иметь каталоги в виде деревьев B + или какую-либо другую структуру данных на диске. Таким образом, превращение файла в каталог или наоборот всегда требует удаления и повторного создания с тем же именем.


1
Интересный. Если никто не придет с решением, я отмечу этот ответ. :-)
— Ионикэ Бизэу

5

Нет, такой команды нет, потому что в этом нет абсолютно никакого смысла. Ваш вопрос похож на просьбу о способе преобразования коробки в плоский прямоугольник. Что бы вы сделали с вещами в коробке (каталог)? Как прямоугольник будет соответствовать коробке, из которой он пришел?

Файлы и каталоги выполняют совершенно разные функции. Хотя каталог действительно является файлом в * nix системах, он применяется только к внутренним частям системы, а не к тому, что вы, пользователь, видите. Таким образом, преобразование файла в каталог или наоборот всегда будет включать удаление файла и создание каталога. Лучшее, на что вы могли бы надеяться, это использовать тот же самый инод, но опять же, в этом нет особого смысла.


Сказать, что в этом нет никакого смысла, - это ваше мнение, а не технический факт.
— Шридхар Сарнобат

@ user7000 Что бы вы сделали с содержимым каталога, когда вы «конвертируете» в файл?
— Тердон

Файловая система хранит данные в древовидной структуре. В компьютерной науке узлы дерева, которые являются листовыми узлами, могут стать внутренними узлами, когда вы добавляете к ним дочерние узлы. И нет, я не собираюсь использовать базу данных, когда файловой системы достаточно.
— Шридхар Сарнобат

2

Создайте функцию, чтобы делать то, что вы хотите. ( bashили предположить другую оболочку типа Bourne / POSIX)

$ dir2file() { rmdir -- "$1" && touch -- "$1";}
$ mkdir adir
$ dir2file adir
$ ls -l adir
-rw-r--r-- 1 xtian xtian 0 2014-03-04 14:59 adir
$ 

Я намеренно использую, rmdirчто не удастся, если adirне является каталогом или не пустой (нет, -fчтобы заставить). touchбудет работать только в случае rmdirуспеха.

Вы можете поместить определение функции в свой файл настройки оболочки ( .bashrcдля bash).


@Stephane Chazelas Что делает --?
— X Tian

2
что --знаменует конец флагов так rmdirи touchничего знать прошлое , это имя файла, даже если он начинается с -.
— Кевин

2

Для тех, кто интересуется, почему вы хотите сделать это, следуйте этой теме:

https://community.linksys.com/t5/Wireless-Routers/Media-files-changing-to-folder-types/td-p/504192/highlight/true

Очевидно ошибка в прошивке перевернула бит в записи каталога для файла, заставляя ОС думать, что это папка, а не файл.

Хотя у меня нет роутера Linksys, что-то изменило все мои файлы .jpg в пустые папки. Если есть какой-то способ перевернуть бит (или что-то еще), который говорит, что запись каталога NTFS - это папка против файла, я бы хотел узнать об этом.

Одно из решений в этом двухлетнем потоке говорило, что если жесткий диск, содержащий папки, которые используются для файлов, подключен к Mac с OS / X, Mac снова увидит их как файлы, и они можно скопировать в папку на Mac. У меня нет Mac, чтобы попробовать это, так что если кто-нибудь знает способ перевернуть бит ...


1

Сначала получите доступ к терминалу и выполните ls -al fileс файлом, который является файлом, который вы хотите преобразовать обратно в ФАКТИЧЕСКУЮ папку. Если в списке есть файлы и подкаталоги, это означает, что ваш «файл» ранее был папкой с реальным содержимым, и вы можете продолжить:

Выполнение:

sudo chmod 700 /

ИЛИ

sudo chmod 700 file

Перезагрузите систему, восстановите доступ к терминалу и выполните:

sudo chmod 744 /

ИЛИ

sudo chmod 744 file

ПОМНИТЕ: «файл» должен быть заменен файлом, который вы хотите преобразовать обратно в ФАКТИЧЕСКУЮ папку.

Это просто произвольный способ решения этой проблемы, но он создает аномалии разрешений, которые вы можете использовать fsck -fдля исправления (пока, конечно, не смонтированного) или вручную при необходимости установить новые разрешения.

СНОВА, это просто проверенный способ избежать удаления файла, который ранее был непустой папкой.


Интересный подход ...
— eyoung100
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.