Переименовать файлы по порядку (дата/время) [duplicate]

На этот вопрос уже есть ответ здесь:

У меня 200 файлов в папке. Я загрузил их в определенном порядке - часто с разницей всего в несколько секунд. Я хотел бы добавить номер к началу каждого из файлов.

Так, первый файл, который я скачал (самый старый), должен измениться с name.txt на 001_name.txt.

Вплоть до последнего файла (самого последнего скачанного), меняя name.txt на 200_name.txt.

Как я могу сделать это с помощью командной строки?

4
задан 14 November 2017 в 12:33

2 ответа

Следующее будет разбито на файлы, содержащие переводы строк, но должно работать в остальное время. Он будет сортировать файлы по времени их последнего изменения, а не по фактическому времени их создания, потому что Ubuntu не хранит время создания файлов. Поэтому, если вы изменили файлы с момента их загрузки, вы не получите точного заказа.

n=0; ls -tr | while read i; do n=$((n+1)); mv -- "$i" "$(printf '%03d' "$n")"_"$i"; done

ls -tr сортирует файлы по времени модификации, сначала по старому (и когда вы передаете вывод ls по конвейеру, он автоматически перечисляет файлы по одной на строку, а не по стандартному способу действий), следует отметить, что это GNU-изм, если вам нужно работать на другом * nix с другой версией ls, это может быть не так). while read i берет этот список и просматривает каждый элемент по одному, а остальная часть выполняет реальное переименование.

n=$((n+1)) увеличивает переменную $n на единицу. Могут быть проблемы, если это было установлено заранее, поэтому, чтобы быть в безопасности, вы должны установить его в 0 в начале строки.

$(printf '%03d' "$n") печатает число, содержащееся в переменной $ n, дополненное тремя нулями (т. Е. 001, 002 ... 087 ... 999). Я надеюсь, что команда mv довольно очевидна.

0
ответ дан 14 November 2017 в 12:33

Следующий сценарий сделает задание:

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

count=1
ls -tr $@ | while read file; do
    if [ $count -lt 10 ]; then
        mv -v $file '00'$count'_'$file
    elif [ $count -lt 100 ]; then
        mv -v $file '0'$count'_'$file
    else
        mv -v $file '0'$count'_'$file
    fi
    count=$(($count+1))
done

Это я просто тестирую его и это работало на меня.

2
ответ дан 14 November 2017 в 12:33

Другие вопросы по тегам:

Похожие вопросы: