На этот вопрос уже есть ответ здесь:
У меня 200 файлов в папке. Я загрузил их в определенном порядке - часто с разницей всего в несколько секунд. Я хотел бы добавить номер к началу каждого из файлов.
Так, первый файл, который я скачал (самый старый), должен измениться с name.txt
на 001_name.txt
.
Вплоть до последнего файла (самого последнего скачанного), меняя name.txt
на 200_name.txt
.
Как я могу сделать это с помощью командной строки?
Следующее будет разбито на файлы, содержащие переводы строк, но должно работать в остальное время. Он будет сортировать файлы по времени их последнего изменения, а не по фактическому времени их создания, потому что 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
довольно очевидна.
Следующий сценарий сделает задание:
#!/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
Это я просто тестирую его и это работало на меня.