Как создать файл с пустым именем?

9

Я не знаю как, но я создал файл с пустым именем файла, я сомневаюсь, что там были пробелы (я объясню почему в конце):

chaouche@karabeela /mnt/ubuntu/storage $ ls
total 352K
drwx------  3 chaouche chaouche 4.0K Feb 12 11:00
drwxr-xr-x  4 chaouche chaouche 4.0K Apr 14 23:13 AUDIO
drwxr-xr-x  5 chaouche chaouche 4.0K Jul 20 22:25 BACKUPS
-rw-r--r--  1 chaouche chaouche 310K Jun 15 13:00 cv_yassine_chaouche_2012.pdf
drwxr-xr-x  2 chaouche chaouche 4.0K Jun 10 22:16 Mageia-3-i586-DVD
drwxr-xr-x  5 chaouche     1001 4.0K Oct 12  2012 MUSIQUE
drwxr-xr-x 15 chaouche chaouche 4.0K Oct 27  2012 PARISVIII
drwxr-xr-x  6 chaouche chaouche 4.0K Jun 12 18:33 SABAYON
drwxr-xr-x  5 chaouche chaouche 4.0K Jun 15 13:23 SIFTECH
drwxr-xr-x  5 chaouche chaouche 4.0K Feb  6 15:11 TOILES
drwxr-xr-x  4 chaouche chaouche 4.0K Jul 17 17:21 VIDEOS
chaouche@karabeela /mnt/ubuntu/storage $

Я спросил на #linux, как удалить файл, и один человек предложил мне убрать все остальные файлы, а затем использовать завершение вкладки, что дало очень интересное поведение:

# with tab completion
chaouche@karabeela /mnt/ubuntu/storage $ ls /
total 45M
-rwxr-xr-x  1 chaouche chaouche  34M Jan 16  2013 inkscape-0.48.4-1-win32.exe
-rwxr-xr-x  1 chaouche chaouche 8.6M Feb  4 11:42 mypaint-1.0.0-win32-installer.exe
-rwxr-xr-x  1 chaouche chaouche 2.7M Jan 17  2013 pdftkb_setup.exe

# without tab completion, wrote "/" by hand
chaouche@karabeela /mnt/ubuntu/storage $ ls /
total 212K
-rw-r--r--   1 root root    0 Apr 15  2012 1
drwxr-xr-x   2 root root 4.0K Dec  9  2012 bin
drwxr-xr-x   3 root root 4.0K Jun 15 12:10 boot
-rw-------   1 root root  74K Jul  1  2011 dead.letter
drwxr-xr-x  19 root root 4.2K Jul 20 20:14 dev
drwxr-xr-x 117 root root  12K Jul 20 21:30 etc
drwxr-xr-x   4 root root 4.0K Jun 12 18:40 home
drwxr-xr-x   2 root root 4.0K Jun  8  2011 initrd
drwxr-xr-x  20 root root  12K Dec  9  2012 lib
drwx------   2 root root  16K Jun  7  2011 lost+found
drwxr-xr-x   4 root root 4.0K Jul  3 01:56 media
drwxr-xr-x   9 root root 4.0K Apr 15 00:06 mnt
drwxr-xr-x   8 root root 4.0K Jun 30 23:19 opt
dr-xr-xr-x 198 root root    0 Jun 15 13:10 proc
drwxr-x---  28 root root 4.0K Jul 20 21:42 root
drwxr-xr-x   2 root root  12K Dec  9  2012 sbin
drwxr-xr-x   2 root root 4.0K Apr  3  2011 srv
drwxr-xr-x  12 root root    0 Jun 15 13:10 sys
-rw-r--r--   1 root root    0 Jun 12 18:40 thisismageia
drwxrwxrwt  69 root root  36K Jul 20 22:04 tmp
drwxr-xr-x  14 root root 4.0K Nov  6  2011 usr
drwxr-xr-x  18 root root 4.0K Jul  2  2011 var
chaouche@karabeela /mnt/ubuntu/storage $

Если бы в имени файла был пробел, он был бы заменен на \ "", когда я нажал клавишу Tab, но это не так.

ychaouche
источник
5
Это каталог, а не файл, очевидно, он содержит три файла.
Bananguin
2
Если вы все еще сохранили каталог, в который вы удалили все, кроме пустого файла, что произойдет, когда вы это сделаете file *?
Джозеф Р.
Нет, к сожалению, я переименовал файл с помощью команды mv.
ychaouche
4
Возможный дубликат файлов с пустыми именами
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
2
Этот вопрос не является дубликатом этого.  Этот вопрос касается практических приемов работы со случайно созданным файлом (или каталогом), имя которого не содержит печатных символов.  Этот другой вопрос - теоретическое, гипотетическое, бессвязное обсуждение способов, которыми вы могли бы создать такой файл, если бы захотели, и ничего не говорит о последствиях.
G-Man говорит: «Восстанови Монику»

Ответы:

14

Невозможно иметь файл с пустым именем. У вас есть файл, имя которого полностью состоит из пустых или непечатаемых символов.

Чтобы точно узнать, как называется файл, запустите LC_CTYPE=C ls -b. Это заменяет все пустые или непечатаемые символы восьмеричными. Например, файл, имя которого представляет собой один пробел нулевой ширины, будет указан как \342\200\213.

Вы можете изолировать этот файл глобусом, который исключает файлы с хорошим именем. Например, вы можете попробовать перечислить файлы, имя которых не начинается с буквы.

chaouche@karabeela /mnt/ubuntu/storage $ ls -d [^A-Za-z]*

Не забудьте эту опцию -d, чтобы в ней был lsуказан сам каталог, а не его содержимое.

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

mv [^A-Za-z]* windows-programs
Жиль "ТАК - перестань быть злым"
источник
5

Это может быть каталог с только пробелами или непечатными символами в имени. Кроме того, похоже, что в нем есть только одна запись, кроме «.» и «..», поэтому вы видите «3» во втором столбце вывода вашей первой команды. Вы всегда можете использовать , statчтобы распечатать имя каталога, с: stat -f "'%N'" *. Если это непечатно, вам, возможно, придется передать его cat -vили od -cпосмотреть, что это на самом деле.

Чтобы удалить его, вам, вероятно, придется запустить rmdir -- 'dirname'(замените 'dirname' на имя каталога. Возможно, вам придется использовать globs, если в нем есть непечатаемые имена), хотя, как я уже говорил, в нем есть содержимое, поэтому вы Придется зайти в этот каталог cd -- 'dirname'и изучить его содержимое.

Я бы посоветовал вам избегать использования rm -rfлюбой ценой, поскольку проблему с именами каталогов легко исправить.

jsbillings
источник