如何将每个子目录中的文件名收集到该子目录中的文本文件中?

如何将每个子目录中的文件名收集到该子目录中的文本文件中?

我想将每个子目录中的所有文件的名称保存到该子目录中的文本文件中,所以我编写了以下脚本:

#!/bin/bash
for X in "$PWD" *
do  
    if [ -d "$X" ];
    then
        cd "$X"
        files="$(ls)"
        echo "$files" >> filesNames.txt
    fi
done

但是,我无法使用以下命令进入子目录:

cd "$X"

这里有什么问题吗?

答案1

根据您的评论,您只需深入一层即可。在这种情况下,您可以使用 glob 迭代目录名称,并为每个目录保存数组中的文件路径,然后将每个路径的最后一个元素打印到fileNames.txt

#!/bin/sh

for dir in "$PWD"/*/; do
arr=( "$dir"* )
printf %s\\n "${arr[@]##*/}" > "$dir"filesNames.txt
done

要排除符号链接,只需添加一个条件,例如if [[ ! -L "${dir%?}" ]]; then arr...

答案2

您需要cd先退出每个子目录,然后再尝试下一个子目录。插入...

cd ..

在循环结束时将为子目录修复此问题,但当您首先在顶级目录中执行此操作时会中断。从cd ..那里开始将带您进入另一个级别,因此其他目录不再可见。

您可以通过将顶级目录保存在变量中来解决所有这些问题,并且cd每次都保存到那里:

#!/bin/bash

TOPDIR="$PWD"
for X in "$PWD" * ; 
do
        if [ -d "$X" ] ;
        then
                cd "$X"
                files="$(ls)"
                echo "$files" >> filesNames.txt
                cd "$TOPDIR"
        fi
done

如果您不想保留以前运行的所有结果,您可能还需要更改>>为。>

答案3

#!/bin/bash
for X in $PWD/* ; do
        if [ -d "$X" ] ; then # first depth directories
                cd "$X" ;
                files="$(ls)" ;
                printf "$files\n" >> filesNames.txt ;
        else # regular files:
                printf "$X\n" >> fileNames.txt ;
        fi ;
done ;

您想要实现的目标可能可以使用-对每个选项find使用附加选项 ( ) - 例如:man find$X

files=$(find ${PWD} -type f) ;
printf "$files\n" >> filesNames.txt ;

答案4

试试这个:

find . -type d -exec sh -c "cd {} ; ls | grep -v '^filesNames.txt$' > filesNames.txt" \;

这将查找当前目录下的所有目录,并且对于每个目录,它cd都会进入该目录并将目录列表写入 a filesNames.txt(从列表中排除该文件)。

如果您希望这些filesNames.txt文件也出现在列表中,请| grep -v ...从命令中删除:

find . -type d -exec sh -c "cd {} ; ls > filesNames.txt" \;

相关内容