Intereting Posts
Что вызывает этот экранный запрос «Экран, используемый <username> на host01.»? Предотвращение Nix от обновления git до git-full создать поврежденную файловую систему FAT Как установить Pulse Secure на Fedora 28 Как запустить HAProxy на CentOS с помощью systemd Multi-Distro boot DVD с SystemRescueCD 2.8.0 не загружает часть SRCD как разрешить SSH-соединение с паролем вместо обмена ключами. Как ссылаться на исходную команду, поэтому я могу заменить ее на функцию Как проверить версию файловой системы? Как сопоставить имя устройства sata с физическим интерфейсом sata для RAID-систем Можно ли установить все доступные пакеты TexLive в Fedora? Высокое использование прерываний IO-APIC-fasteoi eth0 Как отслеживать / исправлять проблему с памятью в большом коде C / C ++ на системах * nix readarray – разделительная строка с использованием разделителя IFS возвращает пустой массив Можно ли получить символ в терминальном курсе, используя escape-коды ANSI?

Переименование файлов на основе имен каталогов

Как я могу переименовать .jpg файлы в несколько папок в зависимости от имени папки? Я также хочу, чтобы файлы .jpg оставались в соответствующих папках и не перемещались. В именах папок нет пробелов.

Например, если имя папки имеет значение «Красный», я хочу, чтобы имена файлов были следующими:

 Red000001.jpg Red000002.jpg Red000003.jpg 

У меня есть следующая команда, но она дает нежелательные результаты, перемещая переименованные файлы за пределы их соответствующих папок и делая имена файлов «sloppy»:

 start=$PWD; for directory in *; do cd "$directory"; for filename in *; do mv "$filename" ../"Folder $directory - $filename"; done; cd "$start"; done 

Если вам нужно входить и выходить из нескольких каталогов, тогда имеет смысл использовать cd - вместо этого вы перейдете в последний текущий рабочий каталог. Или вы используете pushd / popdbash ).

 for directory in *; do pushd "$directory" index=1 for filename in *; do extension="${filename##*.}" if [ "$filename" != "$extension" ]; then extension=".$extension" else # ie there is no dot in the file name extension="" fi target_filename="${directory}$(printf "%06d" "$index")${extension}" if [ -f "$target_filename" ]; then echo "File ${target_filename} exists; aborting." exit 3 fi mv "$filename" "${target_filename}" ((index++)) done popd done 

Этот код не обрабатывает коллизии имен (если он уже есть файл Red00004 ). Он просто проверяет и прерывает.