各サブディレクトリのファイル名をそのサブディレクトリのテキストファイルとして収集するにはどうすればよいですか?

各サブディレクトリのファイル名をそのサブディレクトリのテキストファイルとして収集するにはどうすればよいですか?

各サブディレクトリのすべてのファイル名をそのサブディレクトリのテキストファイルに保存したいので、次のスクリプトを作成しました。

#!/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" \;

関連情報