Как переименовать файлы с определенной структурой имени?

  {name = "php7"; path = "${pkgs.php}/modules/libphp7.so";}

Мне нужно было добавить это в extraModules.

-3
10.08.2020, 12:46
2 ответа

Этот сценарий оболочки выполнит эту работу:

#!/bin/bash
old_filename=$1
IFS='-' read -r -a arr <<< $old_filename    # read dash-separated substrings into the array 'arr'
tmpsub=${arr[7]%.csv.gz}                    # extract 7th substring, stripping out the file extension
for i in $(seq 6 -1 1)                      # shifts right the substrings
do                                          # in the array by one 
    arr[$(($i+1))]=${arr[$i]}               # position, starting by 1
done
arr[1]=$tmpsub                              # set the substring 1 to the value of the previous 7th substring
new_filename=$(printf -- "-%s" "${arr[@]}") # join the substrings into a dash separated string
new_filename=${new_filename:1}".csv.gz"     # add the extension
mv $old_filename $new_filename              # rename the file

Если вы назовете его, например, rename_csv.sh, и сделаете его исполняемым с помощью chmod, вы можете вызвать его, используя только исходное имя файла в качестве входных данных, как показано ниже:

./rename_csv.sh 234-2020-08-06-12-13-14-abc_up.csv.gz

Он не показывает никаких выходных данных, но переименовывает файл как следует.

0
18.03.2021, 23:21

Вы можете попробовать sedдля преобразования имени файла (синтаксис подразумевает GNUsed):

Пример:

echo "234-2020-08-06-12-13-14-abc_up.csv" | sed -E 's/(.*)-([[:digit:]]{4}(-[[:digit:]]{2}){5})-([^.]+).csv/\1-\4-\2.csv/'
234-abc_up-2020-08-06-12-13-14.csv

Это будет искать

  • «любая строка» (, хранящаяся в «группе захвата» 1 ), за которой следует
  • отметка времени в нотации YYYY-MM-DD-hh-mm-ss(, т. е. 4 цифры, а затем 5 раз «тире, за которыми следуют 2 цифры» ), сохраненные в «группе захвата» 2, а затем
  • «любая строка до первой обнаруженной точки, но исключая ее», хранится в группе захвата 4.

Он заменит этот шаблон на "группа захвата 1", "группа захвата 4", "группа захвата 2", а затем .csv, что должно соответствовать вашим требованиям.

Если ваш sedне понимает классы символов POSIX, замените [[:digit:]]на [0-9].

Таким образом, сценарий оболочки может выглядеть так

#!/bin/bash

fname="$1"
newname="$(sed -E 's/(.*)-([[:digit:]]{4}(-[[:digit:]]{2}){5})-([^.]+).csv/\1-\4-\2.csv/' <<< "$fname")"

mv "$fname" "$newname"

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

echo "Would now execute 'mv $fname $newname'"

Если вы не используете bash, вам придется изменить замену команды -на

newname="$(echo "$fname" | sed -E etc.)"
0
18.03.2021, 23:21

Теги

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