Альтернатива для использования в AWK - PullRequest
2 голосов
/ 03 апреля 2020

Мне бы хотелось иметь более элегантное решение для массового переименования файлов, как показано ниже. Файлы были в формате DEV_XYZ_TIMESTAMP.dat, и мы нуждались в них как T-XYZ-TIMESTAMP.dat. В конце я скопировал их все (чтобы быть на одной стороне) в папку renamed:

ls -l *dat|awk '{system("cp " $10 " renamed/T-" substr($10, index($10, "_")+1))}'

Итак, сначала я перечислил все файлы данных, затем взял 10-й столбец (имя файла) и выполнил команду, используя функцию system в awk. По сути, команда копировала оригинальное имя файла в папку переименованную с новым именем файла. Новое имя файла было создано путем удаления префикса (функция awk substring ) перед (включая) _ и добавления префикса "T-".

Эффективно:

cp DEV_file.dat renamed/T-file.dat

Is Есть ли способ использовать cp или mv вместе с некоторыми правилами регулярных выражений, чтобы добиться того же более элегантным способом?

Thx

Ответы [ 3 ]

4 голосов
/ 03 апреля 2020

Вы можете использовать этот скрипт:

for file in *.dat; do
   f="${file//_/-}"
   mv "$file" renamed/T-"${f#*-}"
done

Необходимо избегать синтаксического анализа вывода команды ls.

2 голосов
/ 03 апреля 2020

Если у вас есть rename утилита

rename -E "s/[^_]*/T/" -e "s/_/-/g" *dat

Демо

$ls -1
ABC_DEF_TIMESTAMP.dat
DEV_XYZ_TIMESTAMP.dat
$rename -E  "s/[^_]*/T/" -e "s/_/-/g" * 
$ls -1
T-DEF-TIMESTAMP.dat
T-XYZ-TIMESTAMP.dat
$
1 голос
/ 03 апреля 2020

Вот как я бы это сделал:

cpdir=renamed
for file in *dat; do
    newfile=$(echo "$file" | sed -e "s/[^_]*/T/" -e "y/_/-/")
    cp "$file" "$cpdir/$newfile"
done

Сценарии sed преобразуют все символы без подчеркивания в одном T и затем заменяют каждый _ на -. Если cpdir не обязательно существует до выполнения, вы можете просто добавить mkdir "$cpdir" после первой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...