サブディレクトリ名を解析しようとしていますが、出力結果では名前が個々の単語に分かれています。
例えば。サブディレクトリ名が「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
コマンドで発生しますが、とにかくそれを行う必要はありません。また、ロジックに問題がありますif
。my_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