Bash - 在文件之前列出所有子目录中的目录名称的程序
Posted
技术标签:
【中文标题】Bash - 在文件之前列出所有子目录中的目录名称的程序【英文标题】:Bash - listing programs in all subdirectories with directory name before file 【发布时间】:2016-04-21 02:13:08 【问题描述】:我不需要在一行中执行此操作,但到目前为止我只有 1 行。
find . -perm -111 +type f | sort -r
我要做的是编写一个 bash 脚本,该脚本将显示当前目录中所有可执行文件的列表(z 到 a)。我希望脚本对所有子目录执行相同的操作。我遇到的困难是在该目录/子目录中的可执行文件列表之前显示子目录的名称。
因此,澄清一下,理想的输出可能如下所示:
program1
program2
SubDir1
program3
SubDirSubDir2
program4
SubDir2
program5
我现在拥有的(上面的代码)就是这样做的。它没有删除 /path 并且在更改目录时没有列出新目录的名称。
./exfile
./test/exfile1
./test1/program2
./test1/program
./first
希望这很清楚。
【问题讨论】:
您的意思是对于每个目录,您首先要显示所有目录,然后是文件?您希望目录遵循什么排序顺序? 为了澄清,我想打印当前目录中的可执行程序。然后,打印第一个子目录的名称并列出其下的每个程序。然后对所有子目录执行此操作(递归)。 @paddy 在原帖中添加了新信息 【参考方案1】:这会起作用。
我将权限更改为-100
,因为可能有些程序只能由其所有者执行。
for d in $(find . -type d); do
echo "in $d:"
find $d -maxdepth 1 -perm -100 -type f | sed 's#.*/##'
done
【讨论】:
【参考方案2】:这将为您解决问题。
find . -type d | sort | xargs -n1 -I bash -c "find -type f -maxdepth 1 -executable | sort -r"
第一个查找命令列出所有目录和子目录,并按升序排序。
然后将排序后的目录/子目录传递给xargs
,后者调用bash
以查找目录/子目录中的文件并按降序对它们进行排序。
如果您还想打印目录,您可以在不使用-type f
的情况下运行它。
【讨论】:
【参考方案3】:您可以在所有目录上使用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
【讨论】:
【参考方案4】:嗯,排序要求让这变得很棘手——“for d 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
【讨论】:
以上是关于Bash - 在文件之前列出所有子目录中的目录名称的程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称