【问题标题】:Bash - listing programs in all subdirectories with directory name before fileBash - 在文件之前列出所有子目录中的目录名称的程序
【发布时间】: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 在原帖中添加了新信息

标签: linux bash shell


【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-14
          • 1970-01-01
          • 2012-09-02
          • 2023-01-04
          • 2011-03-01
          相关资源
          最近更新 更多