Пакетное переименование, добавьте дополнительные & ldquo;. & Rdquo; символ в позиции 3 в имени файла, рекурсивно

Я изо всех сил пытался сделать эту работу, но я не очень хорош в регулярных выражениях. Это то, что я пытался сделать, и это не сработало (через 50 минут все еще продолжалось без видимых изменений):

while IFS= read -r -d '' file; do mv $file ${file:0:2}.${file:2}; done

Заранее спасибо!

1
задан 30 March 2015 в 01:00

3 ответа

Одна проблема, с которой Вы оказываетесь перед необходимостью сталкиваться при переименовании файлов в каталогах рекурсивно, разделяет имя файла (который Вы хотите изменить) от пути. Вы не можете просто удалить компонент контура, потому что затем Ваши файлы закончат тем, что были перемещены, а не просто переименованы.

Для использования исходного метода я думаю, что необходимо было бы сделать что-то как

while read -r -d '' f; do 
  file="${f##*/}"; path="${f%/*}" 
  echo mv -- "$path/$file" "$path/${file:0:2}"."${file:2}"
done < <(find -type f -iname "*.wav" -print0)

Другая опция состоит в том, чтобы использовать find команда -execdir вместо -exec. Я думаю, что безопасно предположить, что результаты будут представлены Вашему переименовывать команду (используете ли Вы rename или mv) только с продвижением ./ как путь, в этом случае можно сделать

find -type f -iname "*.wav" -execdir rename -nv -- 's|\./..|$&.|' {} +

или использование большего количества варианта perl-выхода

find -type f -iname "*.wav" -execdir rename -nv -- 's|\./..\K|.|' {} +

или использование чего-то более эквивалентного Вашему оригиналу mv подход

find -type f -iname "*.wav" -execdir bash -c 'echo mv -- "$0" "${0:0:4}"."${0:4}"' {} \;

(обратите внимание, что индексы подстроки были увеличены на 2 для обеспечения продвижения ./ компонент контура).

Если Ваша версия find не имеет -execdir опция, Вы могли изменить rename regex для пропуска самого долгого соответствия соединяют префикс каналом, например.

find -type f -iname "*.wav" -exec rename -nv -- 's|.*/..\K|.|' {} +

Примечание: эти выражения у всех есть переключатели "нет" в них (любое переимя -n опция, или echo команда) так, чтобы можно было проверить то, что они сделали бы перед фиксацией.

1
ответ дан 30 March 2015 в 01:00

Это может быть легко сделано с помощью rename:

rename 's/ /\./' file.txt

Пример:

$ ls -l
-rw-rw-r-- 1 user user 0 Mar 30 04:22 01 Song Title.flac
$ rename 's/ /\./' 01\ Song\ Title.flac 
$ ls -l
-rw-rw-r-- 1 user user 0 Mar 30 04:22 01.Song Title.flac

РЕДАКТИРОВАНИЕ: , Если Вы хотите пространство после 01.:

rename 's/ /\. /' file.txt

, Если Вы хотите все файлы в соответствии с каталогом /directory/to/search и под всеми его подкаталогами, переименовывающими расширение .wav как ожидалось, попробуйте это:

find /directory/to/search -type f -name "*.wav" -execdir rename 's/(^\d+) /$1. /' {} +

Для становления нечувствительным к регистру:

find /directory/to/search -type f -iname "*.wav" -execdir rename 's/(^\d+) /$1. /' {} +
0
ответ дан 30 March 2015 в 01:00

Это работает (протестированное):

#!/bin/bash

filenames=$(find . -type f) # stores all filenames in $filenames
for filename in $filenames; do # for each member in $filenames
    newfilename=$(echo "$filename" | sed 's/\(.*\)\/\(..\)\(.*\)$/\1\/\2\.\3/') # edits $filename by adding a . after the second character and stores the edited string in $newfilename
    mv "$filename" "$newfilename" # renames $filename to $newfilename
done
0
ответ дан 30 March 2015 в 01:00

Другие вопросы по тегам:

Похожие вопросы: