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

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

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

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

しかし、次の方法ではサブディレクトリに入ることができません:

cd "$X"

ここで何が問題なのでしょうか?

答え1

コメントによると、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 ..そこから A を実行すると別のレベルに移動するため、他のディレクトリは表示されなくなります。

これらすべての問題に対処するには、トップ ディレクトリを変数に保存し、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ディレクトリに書き込み、ディレクトリ リストをfilesNames.txt(リストからそのファイルを除外して) に書き込みます。

filesNames.txtファイルもリストに含める場合は、| grep -v ...コマンドから を削除します。

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

関連情報