Сортировка файлов в каталоге, а затем печать содержимого - PullRequest
0 голосов
/ 09 сентября 2018

Мне нужно написать скрипт для сортировки имен файлов по символу, который идет после первого «0» в имени. Все имена файлов содержат как минимум один 0. Затем скрипт должен распечатать содержимое каждого файла в этом порядке.

Я знаю, что мне нужно использовать сортировку и кота. Но я не могу понять, какого рода. Это насколько я могу.


#!/bin/bash

dir=$(pwd)


for n in $dir `ls | sort -u `  ; do

    cat $n
done;

Ответы [ 4 ]

0 голосов
/ 09 сентября 2018

Взгляните на этот find + xargs, который будет правильно обрабатывать имена файлов с "забавными персонажами":

find . -maxdepth 1 -type f -name '*0*' -print0 | sort -zt0 -k2 | xargs -0 cat
0 голосов
/ 09 сентября 2018
dir=$(pwd)

for n in `ls -1 $dir | sort -t0 -k2`; do
   cat $n
done;
0 голосов
/ 09 сентября 2018

Предполагая, что

  1. первый ноль может быть где угодно в имени файла,
  2. может быть несколько файлов с одинаковыми именами после нуля,
  3. вы хотите иметь возможность обрабатывать любое имя файла, включая файлы точек и имена, содержащие переводы строк, и
  4. у вас установлен GNU CoreUtils (стандартно для распространенных дистрибутивов),

вам нужно сделать что-то сумасшедшее, как это (не проверено):

find . -mindepth 1 -maxdepth 1 -exec printf '%s\0' {} + | while IFS= read -r -d ''
do
    printf '%s\0' "${REPLY#*0}"
done | sort --unique --zero-terminated | while IFS= read -r -d ''
do
    for file in ./*"$REPLY"
    do
        […]
    done
done

Пояснение:

  1. Распечатать все имена файлов, разделенные NUL, и прочитать их обратно, чтобы иметь возможность подстановки переменных на них.
  2. Удалите все, вплоть до первого нуля, включая имя файла, и напечатайте его.
  3. Сортировка по оставшейся части имени файла, причем каждый уникальный суффикс печатается только один раз.
  4. Обрабатывать каждый файл, заканчивающийся суффиксом (теперь отсортированным).
0 голосов
/ 09 сентября 2018

Вы можете написать скрипт, который выглядит следующим образом:

#/bin/bash

# using "shopt -s nullglob" so that an empty directory won't give you a literal '*'.
shopt -s nullglob

# get a sorted directory listing
filelist=$(for i in .*0* *0*; do echo "$i"; done | sort -t0 -k2)

IFS=$(echo -en "\n\b")
# iterate over your sorted list
for f in $filelist
do
        # just cat text files.
        file $f | grep text > /dev/null 2>&1
        if [ $? = 0 ]
        then
                cat $f
        fi
done

Тест:

[plankton@localhost SO_scripts]$ ls -l
total 40
-rw-r--r-- 1 plankton plankton  10 Sep  9 10:56 afile0zzz
-rw-r--r-- 1 plankton plankton  14 Sep  9 10:56 bfile xxx0yyy
-rwxr-xr-x 1 plankton plankton 488 Sep  9 10:56 catfiles.sh
-rw-r--r-- 1 plankton plankton   9 Sep  9 10:56 file0123
-rw-r--r-- 1 plankton plankton   9 Sep  9 10:56 file0124
-rw-r--r-- 1 plankton plankton   7 Sep  9 10:56 file0a
-rw-r--r-- 1 plankton plankton   8 Sep  9 10:56 file0aa
-rw-r--r-- 1 plankton plankton   7 Sep  9 10:56 file0b
-rw-r--r-- 1 plankton plankton   9 Sep  9 10:56 file0bbb
-rw-r--r-- 1 plankton plankton  18 Sep  9 10:56 files*_0asdf
[plankton@localhost SO_scripts]$ ./catfiles.sh
. is not a text file
.. is not a text file
Doing catfiles.sh
#/bin/bash

# using "shopt -s nullglob" so that an empty directory won't give you a literal '*'.
shopt -s nullglob

# get a sorted directory listing

filelist=$(for i in .* *; do echo "$i"; done | sort -t0 -k2)

IFS=$(echo -en "\n\b")
# iterate over your sorted list
for f in $(for i in .* *; do echo "$i"; done | sort -t0 -k2)
do
        # just cat text files.
        file $f | grep text > /dev/null 2>&1
        if [ $? = 0 ]
        then
                echo "Doing $f"
                cat $f
        else
                echo "$f is not a text file"
        fi
done
Doing file0123
file0123
Doing file0124
file0124
Doing file0a
file0a
Doing file0aa
file0aa
Doing files*_0asdf
file with * in it
Doing file0b
file0b
Doing file0bbb
file0bbb
Doing bfile xxx0yyy
bfile xxx0yyy
Doing afile0zzz
afile0zzz

Обновлено в соответствии с предложением Песы .*0* *0*.

...