0

UNIX ディレクトリにいくつかのファイルがあります。

/opt/apps/testloc $ ls -mn 
test_1.txt
test_2.txt
test_11.txt
test_12.txt
test_3.txt

これをコマンドでリストしたいのですlsが、ファイル名の末尾の数字に基づいてソートされた順序で出力が必要です。出力は次のようになるはずです。

test_1.txt, test_2.txt, test_3.txt, test_11.txt, test_12.txt

おっしゃる通り取れません。これらのファイル名はテキストと見なされ、次のように並べ替えられました。

test_11.txt, test_12.txt, test_1.txt, test_2.txt, test_3.txt

私のコマンドls –mn(出力をコンマ区切り形式にする必要があるため、使用しました-m

次のプロセスでファイルをインクリメンタル形式で処理するには、これを行う必要があります。

4

4 に答える 4

2

のバージョンで実行sortできる場合:version sort-V

$ ls | sort -V | awk '{str=str$0", "}END{sub(/, $/,"",str);print str}'
test_1.txt, test_2.txt, test_3.txt, test_11.txt, test_12.txt

そうでない場合:

$ ls | sort -t_ -nk2,2 | awk '{str=str$0","}END{sub(/,$/,"",str);print str}'
test_1.txt, test_2.txt, test_3.txt, test_11.txt, test_12.txt
于 2013-03-07T10:03:31.463 に答える
1

出力を特定の形式にする必要があるということは、 ls を使用すべきではないことを示しています。再帰的な結果は必要ないため、グロブを使用してください。

# Bash or ksh + GNU or other sort that handles NUL delimiters

function sortFiles {
    [[ -e $1 ]] || return 1
    typeset a x
    for x; do
        printf '%s %s\0' "${x//[^[:digit:]]}" "$x"
    done |
    LC_ALL=C sort -nz - | {
        while IFS= read -rd '' x; do
            a+=("${x#* }")
        done
        typeset IFS=,
        printf '%s\n' "${a[*]}"
    }
}

sortFiles *
于 2013-03-07T13:56:13.963 に答える
0

すべてのファイル名が正確に 1_文字で、その後に数値が続く場合、この比較的単純なスクリプトは、ファイル名を数値フィールドでソートし、 (そうであるように),[space]区切りリストに出力します。ls -m

ls -1 *_* | sort -t_ -n -k2 | sed ':0 N;s/\n/, /;t0'

ただし、ファイル名に複数の_文字が含まれていて、それらを最後の数値フィールドで並べ替えたい場合 (ファイル名内で必ずしも同じであるとは限りません。たとえばtest_1_3.txttest_2.txt)、より複雑なスクリプトが必要です。

ls -1 *_* |
awk -F '_' '
{
  key[gensub(/\..*$/, "", 1, $NF) "a" NR] = NR;
  name[NR] = $0;
}
END {
  len = asorti(key, keysorted, "@ind_num_asc");
  for (i = 1; i < len; i++) {
    printf "%s, ", name[key[keysorted[i] ] ];
  }
  printf "%s\n", name[key[keysorted[len] ] ];
}'
于 2014-04-04T16:00:20.747 に答える
-1

ls -al | sort +4n : ファイルサイズの昇順でファイルを一覧表示します。つまり、5 番目のフィールドでソートされ、最小のファイルが最初に表示されます。

于 2013-03-07T10:18:47.217 に答える