由于关于软件推荐的问题,我想我可以实现一个程序来解析文件的输出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 是否存在,而且可能还有其他问题,但是,假设我理解你的问题没有错,解决方案的本质似乎是将 的输出逐行导入ls
。xxd -p
所有额外的废话都是 a) 让我在发布之前确保它能正常工作,以及 b) 展示实际的原理。