1

У меня есть ряд файлов, названных в алфавитном порядке (от xaa.tif до xdg.tif). Мне нужно изменить порядок имен файлов, чтобы последний файл обрабатывался первым в скрипте. Я хотел бы переименовать их, добавив число в начале имени файла (от 01xdg.tif до 60xaa.tif).

Как я могу сделать это с помощью bash-скрипта в Linux?

3 ответа3

1

Поскольку имена файлов не содержат специальных символов, включая пробелы, это довольно легко сделать с помощью ls -r (это -r для --reverse , а не -R для --recursive).

/tmp/todo$ ls
/tmp/todo$ touch ab bc bd ef
/tmp/todo$ ls
ab  bc  bd  ef
/tmp/todo$ ls -r
ef  bd  bc  ab
/tmp/todo$

Затем вы можете переименовать файлы, используя что-то вроде:

num=1
for file in $(ls -r)
do
    mv $file "$(seq --format='%02g' $num $num)${file}"
    num=$(( $num + 1 ))
done

Это использует seq для форматирования числа с использованием двух цифр (2), дополненных нулями слева (%0) без десятичных знаков (g) для общей строки формата %02g . Вероятно, есть более эффективный способ сделать это, но с таким небольшим количеством файлов я не стал бы заниматься микрооптимизацией.

Это просто перебирает список файлов (в обратном порядке), переименовывает каждый из них по очереди и увеличивает счетчик для каждого переименования.

Окончательный результат:

/tmp/todo$ ls
01ef  02bd  03bc  04ab
/tmp/todo$

Обратите внимание, что вышеперечисленное вполне может развалиться, если в именах файлов есть что-то более необычное, чем простые az, точки и цифры для начала. В частности, я не уверен, насколько хорошо он будет обрабатывать пробелы.

0

Вы можете сортировать команду пользователя в Linux

допустим, каталог содержит следующие файлы

# ll /tmp/sort_folder
total 0
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 v

Команда sort выдаст вам вывод, как показано ниже (по умолчанию по возрастанию)

# ll /tmp/sort_folder | sort
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 v

Для обратной сортировки (по убыванию) вы можете использовать опцию -r (обратная) для команды сортировки

# ll /tmp/sort_folder | sort -r
total 0
-rw-r--r-- 1 root root 0 Dec 18 19:51 v
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
0

Это должно работать:

#!/bin/bash
#
Count=0
ls -r | while read FileName
do
    FmtCount=`printf %02d $Count`
    mv -i $FileName $FmtCount$FileName
    Count=$((Count+1))
done

Вот объяснение:

  • ls -r выводит список файлов в обратном порядке
  • printf форматирует счет в две цифры с нулем
  • Обратные кавычки превращают вывод в строку

Я думаю, что остальное не требует пояснений, но если нет, пожалуйста, спросите

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .