Вопрос: Переименование файлов на основе имени папки


У меня много index.html файлов в уникальных именованных папках (по одной папке). Я хочу переименовать каждый файл с именем его родительской папки.

Из:

/folder1/index.html
/folder2/index.html
/folder3/index.html
/folder4/index.html
/folder5/index.html

Для того, чтобы:

/folder1/folder1.html
/folder2/folder2.html
/folder3/folder3.html
/folder4/folder4.html
/folder5/folder5.html

Попытка 1

я пытался rename -vn 's:(/[^/]*)/[^/]*$:$1$1.html:' folder/*/*.html который возвращается с:

Using expression: sub { use feature ':5.18'; s:(/[^/]*)/[^/]*$:$1$1.html: }
'folder/*/*.html' unchanged

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

Попытка 2

Затем я попробовал rename -n -v '...' folder/*/*.html, который возвратился с:

Using expression: sub { use feature ':5.18'; ... }
Unimplemented at (eval 2) line 1.

Я использую OSX с переименовать установлен.


2
2018-05-29 09:44


Источник




Ответы:


Это подходит для меня:

rename -vn 's/([^\/]+)\/index/$1\/$1/' folder*/*.html

Печать:

folder1/index.html renamed as folder1/folder1.html
folder2/index.html renamed as folder2/folder2.html
folder3/index.html renamed as folder3/folder3.html
folder4/index.html renamed as folder4/folder4.html
folder5/index.html renamed as folder5/folder5.html

Другое решение sed:

ls -1 folder*/*.html | sed 's/\([^\/]\+\)\/index.html/mv "\0" "\1\/\1.html"/'

Печать:

mv "folder1/index.html" "folder1/folder1.html"
mv "folder2/index.html" "folder2/folder2.html"
mv "folder3/index.html" "folder3/folder3.html"
mv "folder4/index.html" "folder4/folder4.html"
mv "folder5/index.html" "folder5/folder5.html"

Если это печатает правильные команды, просто подключите его к bash, Но сначала убедитесь, что печатные команды будут работать до его выполнения:

ls -1 folder*/*.html | sed 's/\([^\/]\+\)\/index.html/mv "\0" "\1\/\1.html"/' | bash

1
2018-05-29 10:02



Я до сих пор Using expression: sub { use feature ':5.18'; s/([^\/]+)\/index/$1\/$1/ } 'folder*/*.html' unchanged, Не знаю, почему. Я даже переустановил переименование. - evolutionxbox
@evolutionxbox У вас установлен perl? Тогда вы можете просто использовать эту функцию переименования: tips.webdesign10.com/files/rename.pl.txt, Я не знаю, как ваш доморощенный переименовать полезность, размещенную в вашем вопросе. - chaos
У меня нет perl. Я проверил код для homebrew rename, и они очень похожи. Без -v Я не получаю никаких результатов (что очевидно для меня сейчас, даже с -n включен). - evolutionxbox
@evolutionxbox см. мое редактирование, я добавил второе решение - chaos


вы можете попробовать что-то вроде:

for in in `find . -name index.html -type f`
do
bname=$(dirname $i|sed 's:/::g')
mv $i $(dirname $i)/${bname}.html
done

Постскриптум это будет работать только с одним уровнем каталогов и файлов с расширением .html


0
2018-05-29 10:00