在Linux中找到最长的文件名

时间:2017-03-15 12:08:38

标签: linux io-redirection

我正在搜索从我的根目录到最底层的最长文件名。

我编写了一个C程序,它将计算最长文件名的长度及其名称。

但是,我无法让shell将长文件名列表重定向到我的程序接收它的标准输入。

这是我做的:

ls -Rp | grep -v / | grep -v "Permission denied" | ./home/user/findlongest

findlongest已经编译好了,我在我的一个IDE上检查它,以确保它正常工作。到目前为止没有检测到运行时错误。

如何通过重定向stdin将文件名列表添加到我的'findlongest'代码中?

3 个答案:

答案 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的回答中所述