У меня есть куча файлов.. Вот несколько. Еще сотни.

2019-02-08-07-32-00_UM8305_H.PDF  2019-03-17-17-59-59_UM8305_H.PDF  2019-05-05-23-59-59_UM8305_H.PDF  2019-07-08-12-31-57_UM8305_W.PDF  2019-08-20-00-01-52_UM8305_H.PDF  2019-11-07-08-26-51_UM8305_H.PDF
2019-02-08-10-07-45_UM8305_W.PDF  

Я хочу заменить 10-й индекс "-" на "_". Я изменил все файлы, заменив '_' на '-', а затем снова переименовал его, чтобы '_' был '_UM8305_W.PDF' и '_UM8305_H.PDF'. Теперь я не мог найти в Интернете способ заменить '-' в определенном случае. Я хотел найти все '-' и заменить 3-ю, 6-ю и 7-ю позиции, если все они были '-'. Я просто использовал переименование, чтобы заменить его, но не могу сделать это для этого, так как есть тысячи файлов с разными месяцами и днями, и замена не сделает это эффективно.

-1
Kusalananda 20 Ноя 2019 в 22:24
1
Ваше описание сбивает с толку, в ваших именах файлов нет 10-го -. Не могли бы вы привести примеры того, как некоторые имена файлов могут выглядеть после ваших преобразований?
 – 
Kusalananda
20 Ноя 2019 в 22:25
Вы хотите заменить все - на _?
 – 
schrodigerscatcuriosity
20 Ноя 2019 в 22:38
Извините, мое описание не очень хорошее. 2019-02-08-07-32-00-UM8305-H.PDF было исходным именем файла. Я изменил все имена файлов в каталоге, переименовав *-UM8305-H.PDF UM8305_H.PDF. Я хочу изменить 3-й индекс «-» (2019-02-08-07-32-00-UM8305-H.PDF) между 08-07. Я имел в виду 10-ю позицию строки, но это 3-е появление «-». Есть ли более простой способ изменить только определенный символ, но в разных местах имени файла? В этом случае он имеет 7 вхождений. Я только хотел изменить 3-ю, 6-ю и 7-ю позиции с "-" на "".
 – 
Sean King
20 Ноя 2019 в 22:41
1
Не могли бы вы отредактировать вопрос, добавив и/или исправив информацию, а также добавив пример ожидаемого результата? Спасибо
 – 
schrodigerscatcuriosity
20 Ноя 2019 в 22:45
Это то, что вам нужно (замена echo для mv): for f in *.PDF; do echo ${f:0:10}_${f:11}; done
 – 
schrodigerscatcuriosity
20 Ноя 2019 в 23:01

1 ответ

Лучший ответ

В этом решении используется расширение параметров. Предполагается, что имена файлов имеют одинаковую длину и следуют шаблону, в данном случае: YYYY-MM-DD-HH-MM-SS_rest_of_string.PDF

for f in *.PDF; do
  mv $f ${f:0:10}_${f:11}
done

${f:0:10} 

Занимает от начала строки до десятого символа.


Оттуда добавьте _ и напечатайте от двенадцати символов до конца:

_${f:11}

Поскольку количество символов начинается с 0, 11 означает 12 символов.

0
schrodigerscatcuriosity 20 Ноя 2019 в 23:43
Спасибо, я укладывал все в одну строку. теперь немного понял спасибо!
 – 
Sean King
20 Ноя 2019 в 23:45