У меня есть куча файлов, имя файла которых соответствует шаблону 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}