Замена точек в имени файла на подчеркивания, кроме расширения

Итак, вы на самом деле не хотите 2.2, поскольку это бессмысленно.

Если вам нужна точно такая же настройка, вы можете перенести и существующую настройку. https://forums.gentoo.org/viewtopic-t-534039-start-0.html - приблизительное руководство. Пока изображение, которое вы хотите скопировать, не использует параметры, которые не поддерживает ваше оборудование.

Могут работать и другие виды образов. Преимущество приведенного выше руководства в том, что вы можете сделать это из установки.

Не совсем без проблем, вам придется после извлечения добавить root-права и выполнить некоторую настройку. Это непросто, но не слишком сложно, если вы выполняли установку несколько раз, процесс в основном тот же.

Образ хостинговой компании может быть паравиртуализирован, но хорошая новость заключается в том, что ядро ​​ABI стабильно, поэтому у вас не должно возникнуть никаких проблем с настройкой нового ядра для запуска образа.

9
11.10.2016, 09:23
6 ответов

Использование mv , sed и rev в одной строке:

mv "head.body.date.txt" "$(echo head.body.date.txt | rev | sed 's/\./_/2g' | rev)"

Если вы хотите применить его ко всем файлам txt в текущей репутации, использование глобусов может показаться сложным из-за того, как работает mv , но вы можете сделать для ] в однострочном цикле:

for file in *.txt; do mv "$file" "$(echo $file | rev | sed 's/\./_/2g' | rev)"; done

Немного длиннее, но вы можете сопоставить несколько шаблонов в своем цикле!

1
27.01.2020, 20:05
 mv head.body.date.txt head_body_date.txt

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

-1
27.01.2020, 20:05

Перебирайте имена файлов и используйте расширение параметра для преобразования:

for f in *.*.*.txt; do i="${f%.txt}"; echo mv -i -- "$f" "${i//./_}.txt"; done

Шаблон расширения параметра, $ {f //./_} заменяет все . с _ в имени файла ( $ f ).

Вышеупомянутое приведет к пробному запуску, чтобы позволить фактическое переименование, удалите echo :

for f in *.*.*.txt; do i="${f%.txt}"; mv -i -- "$f" "${i//./_}.txt"; done

Если вы хотите иметь дело с любым расширением, а не только с .txt ]:

for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
                     echo mv -i -- "$f" "${pre//./_}.${suf}"; done

После проверки удалить echo для фактического действия:

for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
                     mv -i -- "$f" "${pre//./_}.${suf}"; done

Общий, для произвольного количества точек, по крайней мере, одна:

for f in *.*; do pre="${f%.*}"; suf="${f##*.}"; \
                 mv -i -- "$f" "${pre//./_}.${suf}"; done
12
27.01.2020, 20:05

с ] perl на основе переименовать

$ rename -n 's/\.[^.]+$(*SKIP)(*F)|\./_/g' head.body.date.txt 
rename(head.body.date.txt, head_body_date.txt)
  • \. [^.] + $ (* SKIP) (* F) пропустить этот шаблон и искать альтернативные совпадения
  • | \ ./_/ g заменить все . с _

Или, используя отрицательный просмотр вперед

$ rename -n 's/\.(?![^.]+$)/_/g' head.body.date.txt 
rename(head.body.date.txt, head_body_date.txt)

Если все в порядке, удалите параметр -n

5
27.01.2020, 20:05

bash :

old=head.body.date.txt oldb=${old%.*} olde=${old##*.} ; \
mv -- "$old" "${oldb//./_}.${olde}"
2
27.01.2020, 20:05
rename 's/\.(?=[^.]*\.)/_/g' *.txt

Использует regex-замену, чтобы найти все, кроме последнего экземпляра . в имени файла (без захвата lookahead) и заменяет их на _. При желании обобщается до *.*.

(эта конкретная версия rename, похоже, устанавливается через util-linux). Я использую Ubuntu 12.04 (да, сильно устаревшая машина).

3
27.01.2020, 20:05

Теги

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