Доступ к "безымянному" файлу

1017
alk

У меня такая ситуация в определенном каталоге:

$ ls -al ... drwxr-xr-x 2 me users 8192 Juni 28 15:27 tmp -rw-r--r-- 1 me users 439 Jan. 3 2013 ... 

Как я могу получить доступ ко второй записи, у которой нет имени файла?

4
что насчет `mv" "" newname "`? или, может быть, имя файла состоит из пробелов? попробуй `ls | туалет или что-то подобное mveroone 10 лет назад 0
@Kwaio У вас не может быть файла с пустым именем, или, по крайней мере, `mv" "` не распознает пустой аргумент. alk, вы можете сделать листинг инода с помощью `ls -i`? Вы хотите переместить файл или переименовать его? slhck 10 лет назад 1
Откуда у вас "Juni" или "Jan". Не похоже на право. user568109 10 лет назад 0
@ user568109: «Juni» и «Jan» - немецкие. alk 10 лет назад 0
Как был создан этот файл? https://unix.stackexchange.com/questions/66965/files-with-empty-names Ciro Santilli 新疆改造中心 六四事件 法轮功 6 лет назад 0
@ CiroSantilli709 大 mentioned 六四 事件 法轮功: применение решения, указанного здесь: https://superuser.com/questions/634632/accessing-an-unnamed-file?noredirect=1#comment792292_634668 оказалось, что имя файла содержит непечатаемый персонажи. Так что в качестве имени у него не было «пустой» строки (`" "`). alk 6 лет назад 0

2 ответа на вопрос

7
Daniel Andersson

Пример прогона для создания файла с именем «неразрывный пробел» и его переименования:

$ ls -1 # Each file on a separate row testfile $ touch   # I'm actually writing the character u00a0 here $ ls -1 testfile   $ ls -i # Print inodes 2031842 testfile 2023653   $ find . -maxdepth 1 -inum 2023653 -exec mv {} hithere \; $ ls -i1 2023653 hithere 2031842 testfile 

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

Поскольку переименование не зависит от точных символов имени файла, не должно быть проблем с вводом странных кодовых точек.

Большое спасибо! найти. -inum-exec mv {} gatya \; `сделал это. Пожалуйста, смотрите мой комментарий на * jaychris * ответ для некоторого фона. alk 10 лет назад 0
2
jaychris

Я хотел бы попробовать "ls -1a> / tmp / list" и hexdump, чтобы увидеть, если что-то происходит. Возможно, имя файла - это последовательность пробелов и табуляций. Если hexdump показывает имя файла в виде пробелов (скажем, 1 пробел), то выполните «mv \ somename»

лс -1  ls -1> / tmp / list кот / тмп / список  hexdump / tmp / list 00 01 02 03 04 05 06 07 - 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF  00000000 20 0A {------. mv \ new {------ лс -1 новый 
Оказалось, что имя файла было `^?`. Однако, чтобы получить файл, мне пришлось его переименовать, но я не смог ввести «^?» С клавиатуры, поэтому я успешно использовал подход «inode», предложенный * Daniel Andersson *. Спасибо, в любом случае. alk 10 лет назад 0
Если это какой-то специальный символ, такой как `^?`, Вы также можете перенаправить вывод `ls` в файл, отредактируйте его так, чтобы он содержал только имя файла со странными символами, и используйте его в своей команде:` mv $ (cat file) new_name `(синтаксис bash, вы также можете использовать обратные галочки, но здесь я не могу поставить обратные галочки внутри обратных галочек :) Marki555 8 лет назад 1
@ Marki555 почему бы не опубликовать это в качестве другого ответа. Это умный и простой подход. :-) alk 6 лет назад 0