Здравствуйте, мне нужно переименовать файлы в их отметку времени Unix с датой их модификации и добавить ее в качестве префикса.
Другими словами, мне нужен скрипт для массового переименования Файлы типа
Азбука.jpg
и
XYZ.png
к
1649493072000 ABC.jpg
1649493072182 XYZ.png
Мне также нравится добавлять u- перед каждым файлом, измененным таким образом.
ТАК Я люблю поворачивать
Азбука.jpg
и
XYZ.png
В
u-1649493072000 ABC.jpg
u-1649493072182 XYZ.png
PS:
Ко всем модам обратите внимание, что мой вопрос отличается от других уже заданных вопросов, поскольку я спрашиваю об отметке времени модификации файла UNIX, а не о дате ISO, например, 2022-04-09.
Да, это намеренно
find . -type f -exec \
sh -c '
for i do
d=$(dirname "$i")
[ "$d" = / ] && d=
n=${i##*/}
echo mv "$i" "$d/u-$(stat -c %Y "$i") $n"
done' _ {} +
Это работает рекурсивно в текущем каталоге (.
). Он предназначен только для обычных файлов (не каталогов и т. д.). При необходимости измените -type f
и другие флаги.
Он просто печатает команды mv, чтобы вы могли просмотреть их. Удалите echo
, чтобы бежать по-настоящему.
Мы используем find
для перечисления целевых файлов и его флаг -exec
для передачи этого списка в цикл оболочки, где мы можем анализировать и изменять имена файлов, включая stat
, чтобы получить время модификации.
Я не знаю вашего варианта использования, но лучшим решением может быть просто сохранить вывод: find . -type f -printf '%p u-%T@\n'
в файл для дальнейшего использования (это печатает путь к файлу и время модификации в одной строке). Также, возможно, снимок (если это возможно).
Хм. Этот сценарий выводит только текст CMD и не выполняет команду mv «Также, возможно, снимок (если возможно)». Вы имели в виду что-то вроде этого imgur.com/a/wlG1DMV
См. пункт 2 (убрать echo
). Это обычная практика для примера деструктивной команды (mv
).
Под моментальным снимком я подразумеваю инкрементную резервную копию. Через btrfs, zfs, rsync и т.д.
Ага понял работает. Спасибо. Есть ли способ изменить его так, чтобы он использовал дату создания?
man stat
дает %W
для времени рождения файла (измените %Y
на %W
). Однако обратите внимание, что не все файловые системы записывают время рождения файла. См. первый ответ здесь для более подробной информации: unix.stackexchange.com/questions/91197/…Спасибо за помощь, теперь все работает. Только я не знаю, стоит ли выкладывать нерабочий код на stackoverflow (убрать эхо).
Не волнуйтесь. Как я уже сказал, это хорошая (и распространенная) практика для команды разрушительный (mv
). Если бы была какая-то ошибка, вы могли бы потерять данные. Вы должны прочитать код и объяснение (и понять его настолько хорошо, насколько сможете) перед его запуском.
У вас есть пробел между строкой метки времени и исходным именем файла. Это намеренно?