我不需要在一行中执行此操作,但到目前为止我只有一行。
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 :(得分: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