2016-04-21 25 views
2

我不需要在一行内完成此操作,但目前为止只有一行。Bash - 在文件之前列出目录名称的所有子目录中的程序

find . -perm -111 +type f | sort -r 

我试图做的是写一个bash脚本,将显示在当前目录是可执行(Z到A)中的所有文件的列表。我希望脚本对所有子目录都做同样的事情。我遇到的困难是在该目录/子目录中的可执行文件列表之前显示该子目录的名称。

所以,澄清,理想的输出可能是这样的:

program1 
program2 
SubDir1 
program3 
SubDirSubDir2 
program4 
SubDir2 
program5 

我有什么权利现在(上面的代码)做到这一点。它没有删除/路径,它没有列出目录改变时新目录的名称。

./exfile 
./test/exfile1 
./test1/program2 
./test1/program 
./first 

希望这是明确的。

+0

你的意思是,对于每个目录,你要首先显示所有的目录,然后是文件吗?你想要什么样的顺序在目录可循? – paddy

+0

为了澄清,我想打印的可执行文件程序放在当前目录中,然后打印第一个子目录的名称并列出每个程序。然后针对所有子目录(递归地)执行此操作。 – jonbon

+0

@paddy在原始文章中添加了新信息 – jonbon

回答

1

这将工作。

我将权限更改为-100,因为某些程序只能由其所有者执行。

for d in $(find . -type d); do 
    echo "in $d:" 
    find $d -maxdepth 1 -perm -100 -type f | sed 's#.*/##' 
done 
0

这将为你做的伎俩。

find . -type d | sort | xargs -n1 -I{} bash -c "find {} -type f -maxdepth 1 -executable | sort -r" 

第一个find命令列出所有目录和子目录并按升序对它们进行排序。

然后将排序的目录/子目录传递给xargs,它调用bash来查找目录/子目录内的文件并按降序对它们进行排序。

如果您还希望打印该目录,则可以在不使用-type f的情况下运行该目录。

0

您可以使用所有目录find-print结合起来(打印目录名)和-exec(在该目录中执行查找文件):

find . -type d -print -exec bash -c 'find {} -type f -depth 1 -perm +0111 | sort -r' \; 

让我们打破下来。首先,你必须在目录搜索:

find . -type d -print 

然后要执行的命令为每个目录:

find {} -type f -depth 1 -perm +0111 | sort -r 

只要它看到{}-exec开关将扩大的路径。因为它使用的是shell语法的管道操作符,所以整个事情都被包装在bash -c中。

您可以进一步扩展。如果你想要去除的目录名关的文件和空间我们的搜索结果更好,这样的事情可能就足够了:

find {} -type f -depth 1 -print0 -perm +0111 | xargs -n1 -0 basename | sort -r && echo 
0

嗯,分拣要求使这一棘手 - 在“在$ d(找.. 。。?)”命令很聪明,但很难控制分拣这个怎么样一切都是Z->一,包括目录,但awk的说法是有点怪的; _)

find `pwd` -perm 111 -type f | sort -r | xargs -n1 -I{} sh -c "dirname {};basename {}" | awk '/^\// {dir=$0 ; if (dir != lastdir) {print;lastdir=dir}} !/^\// {print}'

产生

/home/imcgowan/t/t3 jjj iii hhh /home/imcgowan/t/t2 ggg fff eee /home/imcgowan/t/t1 ddd ccc bbb /home/imcgowan/t aaa

相关问题