空白文字で並べ替える方法

空白文字で並べ替える方法

現在の作業ディレクトリのすべてのサブディレクトリ名を一覧表示するシェルスクリプトがあります。名前にスペースがあるディレクトリが最初に表示され、その後に別のディレクトリが表示されるように名前をソートする方法はありますか?

これは私のスクリプトです。

#! /bin/bash

#search for files in a given directory
for file in $*
do
    ls -1p | tr '/' ' '
done

これが生成する出力は次のとおりです。

A7 Provided
a7q3.log
a7q4.log
A7 Starters
lsdir1.sh
lsdir.sh

次のような出力を生成する方法はありますか?

A7 Provided
A7 Starters
a7q3.log
a7q4.log
lsdir1.sh
lsdir.sh

答え1

ソート順序は、次の要素によって決定されます。LC_COLLATEロケール設定。ほとんどの言語は辞書と同じ順序で照合順序を設定します。最初のソートは大文字と小文字を区別せず、英数字以外の文字(スペースなど)を無視します。照合順序をCコードポイントごとに厳密に変更することで、空白が印刷可能なすべての文字の前に来、すべてのラテン大文字が他のすべての文字の前に来ます。

LC_COLLATE=C ls -1

または

LC_ALL=C.utf8 ls -1

スクリプトの多くは意味がありません(単語リストと引数の拡張パターンを繰り返す、ループ本文でループ変数を使用せずに繰り返し、行末にスラッシュのみを出力するls方法で呼び出し、次にそのスラッシュを空白に置き換えます。)何を望んでいるのか分からないので、この問題をどのように解決すべきかを申し上げることはできませんが、これにならなければならない$*場合"$@"や、$*話になる場合はほとんどないということは申し上げます。"$*"$@

答え2

ls空白のあるファイル名(存在する場合)を最初に出力し、空白のないファイル名を出力するカスタム関数が必要ですか?次の関数はbashのextglobシェルオプションを使用してワイルドカードを有効にします!(* *)。これは、「空白なしですべてのファイル名に拡張」を意味します。また、シェルのオプションが変更されないように、一時サブシェル(関数の本文に中括弧ではなく括弧を使用)を作成します。

function ls() (
  command ls -1 *' '* 2>/dev/null
  shopt -s extglob
  command ls -1 !(* *) 2> /dev/null 
)

もちろん名前を付ける必要はありませんls。 (ほぼ)好きなように名前を付けることができます。

関連情報