Bashスクリプト:現在のディレクトリの代わりにサブディレクトリを解析します。

Bashスクリプト:現在のディレクトリの代わりにサブディレクトリを解析します。

サブディレクトリ名を解析しようとしていますが、出力結果では名前が個々の単語に分かれています。

例えば。サブディレクトリ名が「Hello World」の場合、出力は次のようになります。

.  
Hello  
World  

次のコードは機能しますが、出力には望ましくない現在のディレクトリが含まれています。

find "$my_dir" -maxdepth 1 -type d -print0 |
    while IFS= read -rd '' dir;
        do 
            echo "$dir"; 
        done

出力から現在のディレクトリを削除するifステートメントを含めようとしましたが、コードにはまだサブディレクトリ名ごとに別々の単語が表示されているようです。

find "$my_dir" -maxdepth 1 -type d -print0 |  
    while IFS= read -rd '' dir;
        do 
            if ["$dir" != "."]; then
                echo "$dir"
            fi
        done

答え1

空白による中断はreadコマンドで発生しますが、とにかくそれを行う必要はありません。また、ロジックに問題がありますifmy_dir等しい場合にのみ機能し.、それ以外の場合は出力にaを生成しfindません。.最後に、この例では、パス全体ではなくディレクトリ名だけが必要であることを明示し、作成した方法でパスがfind標準出力に渡されます。

より簡単な解決策は次のとおりです。

find "$my_dir" -maxdepth 1 -type d -exec basename {} \;|tail -n +2

ここでtail秘密はコマンドです。$my_dir出力から開始ディレクトリ()を除外しようとしています。findこのディレクトリは常に最初に出力されるため(深度優先巡回を明示的に要求しない限り)、結果出力から最初の行を削除するだけです。

答え2

その場合は、-mindepthここでツリーの最上位ディレクトリを除外するために使用できるこのオプションを使用してください。

find "$my_dir" -mindepth 1 -maxdepth 1 -type d -print0

-maxdepthしかし、深さも制限しているので、forループを使うのはどうですか?

for dir in "$my_dir"/*
do
    [[ -d "$dir" ]] || continue    # only directories
    echo "${dir/*\/}"              # just basename
done

関連情報