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

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).

X Тянь
источник
@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