我从我的根目录search最长的文件名到最底部。
我编写了一个C程序,将计算最长的文件名的长度和名称。
但是,我不能让shell将文件名的长列表redirect到我的程序接收它的标准input。
这是我做的:
ls -Rp | grep -v / | grep -v "Permission denied" | ./home/user/findlongest
findlongest已被编译,我检查了我的一个IDE,以确保它正常工作。 目前没有发现运行时错误。
如何通过redirect标准input将文件名列表添加到我的“findlongest”代码中?
关于什么
find / -type f | /home/user/findlongest
它将以绝对路径列出来自根的所有文件,并只列出您有权列出的文件。
尝试这个:
find / -type f -printf '%f\n' 2>/dev/null | /home/user/findlongest
2>/dev/null
将放弃写入到stderr
所有数据(这是您看到'Permission denied'消息来自的地方)。
或者从下面删除你的应用程序的依赖(从这里 ):
find / -type f -printf '%f\n' 2>/dev/null | \ awk 'length > max_length { max_length = length; longest_line = $0 } END { print length(longest_line) " " longest_line }'
根据命令:
find -exec basename '{}' ';'
它只递归地打印从你所在目录开始的所有文件的文件名:所有的文件名。
这个bash行将提供最长的文件名和字符数:
请注意,所涉及的循环会使进程变慢。
for i in $(find -exec basename '{}' ';'); do printf $i" " && echo -e -n $i | wc -c; done | sort -nk 2 | tail -1
按部分:
打印文件的名称,后跟一个空格:
printf $i" "
打印此文件的字符数:
echo -e -n $i | wc -c
按字符数排序输出,并采取最长的一个(最新):
sort -nk 2 | tail -1
所有这些都在for循环中逐行处理。
句子也可以通过以下方式更改:
for i in $(find -type f -printf '%f\n');
正如@ Attie的答案所述