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

Попробуйте принудительно удалить пакет libpcap:

# apt-get -f remove libpcap0.8 libpcap0.8-dev:i386 libpcap0.8-dev

Затем попробуйте установить gpart:

# apt-get install gpart
1
21.11.2018, 00:25
6 ответов

Использование команды perl rename (которая полностью отличается от команды rename из util-linux ) :

rename -v 's/^(\d{4})(\d{2})(\d{2})/$1-$2-$3/' 2015*

(используйте -n вместо -v для пробного запуска, чтобы сначала проверить команду).

Эта версия Perl переименовать в вашей системе может называться prename или file-rename . Он гораздо более эффективен и полезен, чем версия rename util-linux . Если он у вас не установлен, вам следует установить его. Если он не упакован для вашего дистрибутива, вы можете установить его из CPAN

. Кстати, вы можете узнать, установлен ли он уже, запустив rename -V . Если он выдаст такой вывод:

$ rename -V
Unknown option: V
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

или этот:

$ rename -V
/usr/bin/rename using File::Rename version 0.20

, значит, у вас установлен perl rename . Первый указывает на старую версию (которая AFAIK продолжает существовать только при предварительных установках debian, включенных как часть пакета perl ). Последний указывает текущую версию (теперь отдельный пакет под названием rename ).

1
27.01.2020, 23:13

В моем дистрибутиве есть команда perl-rename, которая может использовать регекс в стиле perl для массового переименования файлов. Команда rename принимает только пару фиксированных строк для переименования.

0
27.01.2020, 23:13

Использование встроенного расширения подстроки bash:

for f in 2015* ; do
  mv "$f" "${f::4}-${f:4:2}-${f:6}"
done
2
27.01.2020, 23:13

С sed :

LC_ALL=C sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/' <file
2
27.01.2020, 23:13

быстрое и грязное не полное решение

#!/usr/bin/env bash
str=$1
yyyy=$(echo "$str" | awk -F '_' '{print $1}' | awk '{print substr($0, 1, 4)}')
mm=$(echo "$str" | awk -F '_' '{print $1}' | awk '{print substr($0, 5, 2)}')
dd=$(echo "$str" | awk -F '_' '{print $1}' | awk '{print substr($0, 7, 2)}')
new_str=$yyyy-$mm-$dd'_'`echo $str | awk -F'_' '{print $2}'`
echo $new_str

вывод :

$ bash script.sh '20150716_something-here'
2015-07-16_something-here
0
27.01.2020, 23:13

Хотя rename - очень мощный инструмент, я обычно предпочитаю простоту утилиты mmv (множественное перемещение) :

mmv '????????_*' '#1#2#3#4-#5#6-#7#8_#9'

? в шаблоне поиска стоит для одного символа * для произвольно длинной последовательности символов. В шаблоне замены каждый # обозначает соответствующий ? или * в шаблоне поиска. В дополнение к ? и * , mmv поддерживает диапазоны символов в скобках (например, [a-f] ).

( mmv проверит любые конфликты при переименовании перед началом работы, поэтому вы не рискуете потерять файлы при перезаписи.)

2
27.01.2020, 23:13

Теги

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