获取十六进制或 base64 格式的文件名

获取十六进制或 base64 格式的文件名

由于关于软件推荐的问题,我想我可以实现一个程序来解析文件的输出ls -l并以类似 Explorer 的风格显示文件。这种方法在 ServerFault 上建议。与此同时,其他人阻止解析ls

所以我想知道是否有办法以十六进制或 base64 格式列出文件名,从而可以绕过任何类似的特殊字符\n

答案1

我猜你想同时显示文件名和十六进制值。在这种情况下,下面是一行简单的代码来演示这是可能的:

$ 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

输出的进一步定制留给读者作为练习。

答案2

好吧,你可以叫我菜鸟,但我尝试了 John1024 的建议,结果却出错了,所以我试着自己解决。我创建了一个名为的文件,readline.sh其中包含以下内容:

#!/bin/bash

file=$1      # $1 contains the argument passed
> line.txt   # create/empty line.txt
IFS=$'\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 是否存在,而且可能还有其他问题,但是,假设我理解你的问题没有错,解决方案的本质似乎是将 的输出逐行导入lsxxd -p所有额外的废话都是 a) 让我在发布之前确保它能正常工作,以及 b) 展示实际的原理。

相关内容