В связи с вопросом о Рекомендациях по программному обеспечению , я подумал, что смогу реализовать программу, которая анализирует выходные данные ls -l
и отображает файлы в стиле проводника. Этот подход был предложен на ServerFault . В то же время, другие люди препятствуют анализу ls
.
Поэтому мне интересно, есть ли способ перечислить имя файла в шестнадцатеричном или base64 формате, который бы обходил любые специальные символы, такие как \n
и подобные.
Я предполагаю, что Вы хотите отобразить имена файлов вдоль стороны их шестнадцатеричное значение. В этом случае вот простая строка кода, чтобы продемонстрировать, что это возможно:
$ 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
.
, которую Дальнейшую настройку вывода оставляют как осуществление для читателя.
Ну, назовите меня новичком, но я попробовал предложение 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) для показа принципа в действии.