2013-03-07 2 views
0

У меня есть некоторые файлы в каталоге UNIX:имен список файлов с упорядоченномом - команда Ls

/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)

Мне нужно, чтобы это было для обработки файлов в инкрементном формате в следующем процессе.

ответ

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 
+0

добавить трубку в 'tr '\ n' ',', чтобы получить список csv, как запрошено OP. –

+0

теперь вы слишком усложняете вещи :-). +1 тем не менее –

+0

@Fredrik Мне не нравится 'tr '\ n' ',' ', поскольку он заменяет завершающую новую строку', 'также OP want', ', которая не может быть выполнена с помощью' tr', поэтому используя 'awk' вы сохраняете трубку. –

-1

Ls -al | sort + 4n: Список файлов в в порядке возрастания размера файла. i.e , отсортированный по 5-й поданной и отображающей наименьшие файлы.

1

Что вы хотите, чтобы выход был в определенном формате, говорит мне, что вы shouldn't be using ls. Поскольку рекурсивные результаты не требуются, используйте glob.

# 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 * 
0

Если все имена файлов содержат ровно один _ символ, за которым следует числовое значение, это относительно простой скрипт сортирует имена файлов в числовом поле и выводить их в ,[space] отделенной список (как ls -m делает):

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

Однако, если есть несколько _ символов в именах файлов, и вы хотите, чтобы отсортировать их по последнему числовому полю (не обязательно же в именах файлов, например test_1_3.txt и test_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] ] ]; 
}' 
Смежные вопросы