我正在搜索从我的根目录到最底层的最长文件名。
我编写了一个C程序,它将计算最长文件名的长度及其名称。
但是,我无法让shell将长文件名列表重定向到我的程序接收它的标准输入。
这是我做的:
ls -Rp | grep -v / | grep -v "Permission denied" | ./home/user/findlongest
findlongest已经编译好了,我在我的一个IDE上检查它,以确保它正常工作。到目前为止没有检测到运行时错误。
如何通过重定向stdin将文件名列表添加到我的'findlongest'代码中?
答案 0 :(得分:3)
试试这个:
find / -type f -printf '%f\n' 2>/dev/null | /home/user/findlongest
2>/dev/null
会丢弃写入stderr
的所有数据(您可以在此处查看“拒绝权限”和“来自的消息”。
或以下内容删除您的应用程序的依赖性(来自here):
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
}'
答案 1 :(得分:2)
怎么样?
let myClassInstance = '123'
它将列出具有绝对路径的root用户的所有文件,并仅打印您有权列出的文件。
答案 2 :(得分:0)
基于命令:
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
句也可以通过以下方式更改:
for i in $(find -type f -printf '%f\n');
正如@ Attie的回答中所述