Получение имени файла в шестнадцатеричном или base64

В связи с вопросом о Рекомендациях по программному обеспечению , я подумал, что смогу реализовать программу, которая анализирует выходные данные ls -l и отображает файлы в стиле проводника. Этот подход был предложен на ServerFault . В то же время, другие люди препятствуют анализу ls .

Поэтому мне интересно, есть ли способ перечислить имя файла в шестнадцатеричном или base64 формате, который бы обходил любые специальные символы, такие как \n и подобные.

3
задан 14 April 2017 в 01:50

2 ответа

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

$ touch abc 'd e f' 
$ find . -maxdepth 1 -type f -exec sh -c 'printf "%-10s %s\n" "$1" "$(printf "$1" | xxd -pu )"' None {} \;
./abc      2e2f616263
./d e f    2e2f6420652066

идея состоит в том, что для каждого файла мы находим, что работаем printf со строкой формата и двумя аргументами. Первым аргументом является имя файла, и вторым является имя файла, преобразованное в шестнадцатеричное число с утилитой xxd.

, которую Дальнейшую настройку вывода оставляют как осуществление для читателя.

3
ответ дан 14 April 2017 в 01:50

Ну, назовите меня новичком, но я попробовал предложение John1024, и оно дало мне ошибку, таким образом, я пытался понять это самостоятельно. Я сделал файл названным readline.sh, который содержал следующее:

#!/bin/bash

file=$1      # $1 contains the argument passed
> line.txt   # create/empty line.txt
IFS= 

Теперь для выполнения его я звонил ls | ./readline.sh, и это произвело следующее:

bar
626172
baz
62617a
foo
666f6f
line.txt
6c696e652e747874
readline.sh
726561646c696e652e7368

Теперь, я хочу указать, что этот сценарий не имеет никакого способа проверить, что 1$ даже существует, и существуют, вероятно, другие проблемы с ним, но, предполагая, что я понимаю Ваше право вопроса, кажется, что сущность решения состоит в том, чтобы передать вывод по каналу ls линию за линией в xxd -p. Весь дополнительный пух был a) чтобы я удостоверился, что это работало прежде, чем отправить его и b) для показа принципа в действии.

\n' # set Internal Field Separator to '\n' for line in `cat $file` # assign each line in $file to $line do echo $line >> line.txt # print $line to line.txt # this one's tricky because you need to pipe just the line # (without a '\n') into xxd and then print it to line.txt echo `printf "%s" "$line" | xxd -p` >> line.txt done cat line.txt # we want to see the contents of line.txt now

Теперь для выполнения его я звонил ls | ./readline.sh, и это произвело следующее:

bar
626172
baz
62617a
foo
666f6f
line.txt
6c696e652e747874
readline.sh
726561646c696e652e7368

Теперь, я хочу указать, что этот сценарий не имеет никакого способа проверить, что 1$ даже существует, и существуют, вероятно, другие проблемы с ним, но, предполагая, что я понимаю Ваше право вопроса, кажется, что сущность решения состоит в том, чтобы передать вывод по каналу ls линию за линией в xxd -p. Весь дополнительный пух был a) чтобы я удостоверился, что это работало прежде, чем отправить его и b) для показа принципа в действии.

1
ответ дан 14 April 2017 в 01:50

Другие вопросы по тегам:

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