Как отсортировать по названию, а затем изменить дату в BASH - PullRequest
0 голосов
/ 24 сентября 2018

Допустим, у меня есть папка с файлами .txt, которые имеют dd-MM-yyyy_HH-mm-ss время, за которым следует _name.txt.Я хочу иметь возможность сортировать по имени, а затем время после.Пример:

ДО

  • 15-2-2010_10-01-55_greg.txt
  • 10-2-1999_10-01-55_greg.txt
  • 10-2-1999_10-01-55_jason.txt

ПОСЛЕ

  • greg_1_10-2-1999_10-01-55
  • greg_2_15-2-2010_10-01-55
  • jason_1_10-2-1999_10-01-55

Редактировать: извинения, от моего "cp"Я должен был скопировать их в другой каталог с другим именем.

Я пытался сделать копию с подсчетом, но он не сортирует файлы с тем же именем должным образом.по срокам:

cd data/unfilteredNames
for filename in *.txt; do
    n=${filename%.*}
    n=${filename##*_}
    filteredName=${n%.*}
    count=0
    find . -type f -name "*_$n" | while read name; do 
        count=$(($count+1))
        cp -p $name ../filteredNames/"$filteredName"_"$count"
    done
done

1 Ответ

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

Не уверен, что переименование файлов является одним из ваших ожиданий.По крайней мере, для сортировки только имени файла вам не нужно.

Вы можете сделать это только с помощью команды GNU sort:

sort -t- -k5.4 -k3.1,3.4 -k2.1,2.1 -k1.1,1.2 -k3.6,3.13 <(printf "%s\n" *.txt)

-t устанавливает разделитель полейдо тире -.

-k позволяет сортировать по полям.Как объяснено на странице man sort, синтаксис: -k<start>,<stop>, где <start> или состоит из <field number>.<position>.Добавление в команду нескольких опций -k позволяет сортировать по нескольким полям;первый в командной строке имеет больший приоритет, чем другой.

Например, первый -k5.4 указывает сортировать по 5-м полям со смещением в 4 символа.Поле остановки отсутствует, потому что это конец имени файла.
Опция -k3.1,3.4 сортирует на основе 3-го поля, начиная со смещения от 1 до 4.
Тот же принцип применяется к другим опциям -k.

В вашем примере поле месяца имеет только 1 цифру.Если у вас есть файлы с кодом месяца, состоящим из 2 цифр, вы можете добавить 0 к именам всех месяцев.Это можно сделать, добавив в оператор printf этот <(... | sed 's/-0\?\([0-9]\)/-0\1/') и изменив -k 2.1,2.1 на -k2.1,2.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...