Bash - 在文件之前列出目录名称的所有子目录中的程序

时间:2016-04-21 02:13:08

标签: linux bash shell

我不需要在一行中执行此操作,但到目前为止我只有一行。

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

希望这很清楚。

4 个答案:

答案 0 :(得分:1)

这样可行。

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

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

答案 1 :(得分:0)

这将为你解决问题。

xargs

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

然后将已排序的目录/子目录传递给bash,调用-type f以查找目录/子目录中的文件,并按降序对它们进行排序。

如果您还希望同时打印目录,则可以在不使用{{1}}的情况下运行该目录。

答案 2 :(得分: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

答案 3 :(得分:0)

嗯,排序要求使得这一点变得棘手 - “for $ in $(find ...)”命令很聪明,但难以控制排序。这个怎么样?一切都是z-> a,包括目录,但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