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 - 在文件之前列出所有子目录中的目录名称的程序的主要内容,如果未能解决你的问题,请参考以下文章

Mac - 列出目录及其子目录中的所有图像路径(名称)

如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称

用于在没有 -R 的 FTP 服务器上列出递归目录的 Bash 脚本

列出一个目录+子目录中的所有文件和目录

git中Bash基本操作命令

ls -列出当前目录下所有的文件或者目录