Пакетное переименование файлов, включая дефис и все, что следует после

Список ошибок , на который вы ссылались в вашем PasteBin , вводит вас в заблуждение.

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

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

# route add 152.48.25.29 reject; echo SS=$?
SS=0
# route add 152.48.25.29 reject; echo SS=$?
SIOCADDRT: File exists
SS=7

Вы также получите тот же код выхода из route, если попытаетесь удалить несуществующий -маршрут:

# route delete 152.48.25.29 reject; echo SS=$?
SS=0
# route delete 152.48.25.29 reject; echo SS=$?
SIOCDELRT: No such process
SS=7

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

#!/bin/bash
route add 152.48.25.29 reject 2>/dev/null
exit 0

(Вы ведь знаете, как передавать и ссылаться на параметры в скрипт, используя "$1"и друзей, а не дословно внедрять IP-адреса, не так ли?)

-4
28.03.2021, 19:38
3 ответа

Если у васperl-rename(установлено как renameво многих системах, включая Debian и Ubuntu ), вы можете выполнить:

$ rename -n 's/(.+?)-.*\./$1./' *jpeg
10154-person134_bacteria_640.jpeg -> 10154.jpeg
10163-NORMAL2-IM-0141-0001.jpeg -> 10163.jpeg
10175-person147_bacteria_707.jpeg -> 10175.jpeg
2555-person1_virus_12.jpeg -> 2555.jpeg
25562-person132_bacteria_632.jpeg -> 25562.jpeg
25566-person143_bacteria_687.jpeg -> 25566.jpeg

Если это показывает ожидаемый результат, запустите команду еще раз без -n, чтобы фактически переименовать файлы.

Кроме того, вы можете сделать это в оболочке:

$ for file in *jpeg; do echo mv -- "$file" "${file%%-*}.jpeg"; done
mv -- 10154-person134_bacteria_640.jpeg 10154.jpeg
mv -- 10163-NORMAL2-IM-0141-0001.jpeg 10163.jpeg
mv -- 10175-person147_bacteria_707.jpeg 10175.jpeg
mv -- 2555-person1_virus_12.jpeg 2555.jpeg
mv -- 25562-person132_bacteria_632.jpeg 25562.jpeg
mv -- 25566-person143_bacteria_687.jpeg 25566.jpeg

Опять же, если это выводит то, что вы ожидаете, запустите команду без echo, чтобы фактически переименовать файлы.

5
28.04.2021, 22:55

Если у вас не установлена ​​утилита переименования, вы можете установить свою

perl -e 'rename $_, s/-.*\././r for @ARGV'./*.jpeg

Или с помощью GNU-версий инструментов sed и xargs, где мы добавляем суффикс нулевого байта \0чтобы смягчить проблемные имена файлов.

printf '%s\0' *.jpeg  |
sed -ze 'p;s/-.*\././' |
xargs -r0 -n2 -t mv --
1
28.04.2021, 22:55

Или, если вы хотите использовать awk,

#!/bin/sh

files="10154-person134_bacteria_640.jpeg
10163-NORMAL2-IM-0141-0001.jpeg
10175-person147_bacteria_707.jpeg  
2555-person1_virus_12.jpeg 
25562-person132_bacteria_632.jpeg          
25566-person143_bacteria_687.jpeg"

for f in $files; do
  name=`echo $f | awk -F- '{print $1}'`
  echo $name.jpeg
done
1
28.04.2021, 22:55

Теги

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