Назад | Перейти на главную страницу

Как массово переименовать файлы, чтобы удалить лишнее пространство перед расширением

У меня есть куча файлов, имя файла которых соответствует шаблону filename.ext. например:

filename .ext

Я хотел бы переименовать все это, чтобы удалить пробел перед .ext. например:

filename.ext

Я могу найти их все, используя

find * -type f -name'* .*'

а как потом переименовать все эти файлы?

Создайте файл с именем "renamethis.sh". Его содержимое должно быть:

#!/bin/bash
mv "$1" "$(echo $1 | sed 's/ \././')"

Установите исполняемый бит: chmod a+x renamethis.sh. Затем запустите что-то вроде:

find /path/to/dir -name '* .*' -type f -print0 | xargs -0L 1 /path/to/renamethis.sh

YMMV, никаких гарантий, явных или подразумеваемых и т. Д.

FWIW, именно пробелы делают это странным; пока у вас нет других необычных символов в именах файлов, вы можете использовать этот подход. Если вы это сделаете, вы можете рассмотреть что-то вроде цикла scandir / readdir в Perl или PHP, но приведенный выше сценарий - это первое, что приходит в голову.

В одной строке:

find -depth -name '* .*' -print0 |
perl -wn0e '$orig = $_; s/\s+\././g; rename($orig, $_) or warn "$orig: $!\n"'

Особенности:

  • нет проблем с цитированием пробелов в именах файлов
  • нет проблем с именами файлов, начинающимися с тире
  • быстро: только два процесса запущены параллельно
  • правильно обрабатывает каталоги

Я вижу, что вы уже решили свою непосредственную проблему, но в будущем вы можете подумать об использовании mmv.

Это должно сделать это за вас.

#!/bin/bash

OLDIFS=${IFS}
IFS=$'\n'

for file in `find * -type f -name '* .*'`; do
 _ext=`echo ${file} | cut -d '.' -f 2-`
 _filename=`echo ${file} | cut -d ' ' -f 1`
 mv "${file}" ${_filename}.${_ext}
done

IFS=${OLDIFS}