スペースを含むディレクトリ名を読むためにforループを作成するにはどうすればよいですか?

スペースを含むディレクトリ名を読むためにforループを作成するにはどうすればよいですか?

ディレクトリ内のフォルダを検索し、各フォルダの名前を取得し、.txtファイルを作成し、フォルダ名に名前を付け、そのフォルダに入れるスクリプトを作成する必要があります。

例:ディレクトリに「1」、「2」、および「3」という名前の3つのフォルダがあります。そのフォルダ名で名前が付けられた各フォルダに.txtファイルを作成し、フォルダ1に「1.txt」、「2.txt」などをフォルダ2に保存します。

私はこのスクリプトを使ってこれをしました。

for i in $(ls -d */); do touch "$i $(basename $i).txt" ; done

問題は、名前にスペースが含まれているフォルダに対して同じことをしたいということです。たとえば、「Test Me」というフォルダがあると、次のエラーが発生します。

Me: no directory with that name

「Me」という単語だけを見て、「Test Me」全体ではなくフォルダとして扱います。

どうすればいいですか?

修正する これはTAAPSogekingが以下に述べた解決策です(彼にもう一度感謝します)。 for dir in *; do [ -d "$dir" ] && touch "$dir/$dir.txt"; done

答え1

入れ子になったサブディレクトリがすべて必要ではなく、直接ディレクトリのみが必要であるとします。以下は、現在ループしたいディレクトリと同じディレクトリにあるとします。

for dir in *; do 
    [ -d "$dir" ] && touch -- "$dir/$dir.txt"
done
  1. 現在のディレクトリのすべてのファイルを繰り返します。
  2. ディレクトリをフィルタリングします(ディレクトリへのシンボリックリンクを含む)。
  3. 次に、指定されたディレクトリに要求されたファイルを作成します。

また、に興味がある可能性があります住宅検査一般的な間違い/悪い慣行(たとえば、この例ではlsを使用)を指摘してください。

答え2

これにより、zsh次のことができます。

touch -- *(/e['REPLY+=/$REPLY.txt'])

ここで/、glob修飾子はglob拡張をファイルタイプに制限します。目次-/(ディレクトリへのシンボリックリンクも考慮したい場合に変更)修飾子は、指定されたeコードeを評価してパス(に保存されている$REPLY)を変更します。DDotファイルの場合)修飾子を追加すると、隠しディレクトリに対してもこれが行われます(いかなる場合も含まれません)...

関連情報