Intereting Posts
Как перенести файл на CIFS-mount? LFS не может подключиться к lfs / source – разрешено отклонение Отдайте все в двух цветах «Не удается найти -lgdbm» при создании xemacs в FreeBSD10 в чем цель setuid включена без исполняемого бита? Linux newbie: Как использовать Jack? Как работает Linux? Как заставить KDE запрашивать новых пользователей для пароля, когда я использую / etc / skel для настройки их среды? mtrack: как получить вертикальные зоны кнопок? Почему find с -delete удаляет файлы в каталоге / save /, когда find без удаления не смог найти их? Как помещать вспомогательную оболочку и связанные с ней команды в фоновом режиме? Удаление ненужных папок конфигурации Где я могу найти сообщения о последней неудачной загрузке Linux? Почтовый клиент Linux, который может запускать скрипт PHP для анализа полученного сообщения электронной почты Как я могу искать и выделять несколько строк в VIM? Выделение целых чисел, заключенных в круглые скобки

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

Как я могу переименовать .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 ). Он просто проверяет и прерывает.