Удалить определенное слово из имени файла

set -o errexit может быть сложным в петлях и оболочках, потому что вы должны пройти путь обратно из процесса.

Нарушение петли (даже при нормальной работе) считается неправильной практикой. Вы можете называть меня старой школой, чтобы предпочитать while-loop, а не for-loop для двух условий, но я считаю, что лучше читать:

i=1
RET=-1
while [ $i -le 5 ] && [ $RET -ne 0 ]; do
    [ $i -eq 1 ] || sleep 5
    echo "attempt number: "$i
    curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
    RET=$?
    i=$((i+1))
done
exit $RET

-121--32402-

Проще делать группы [имя _ пользователя]

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

cat/etc/passwd | awk -F ':"" {print $1} "| xargs -n1 groups

При получении" groups: команда не найдена, "вероятно, вы отредактировали свой путь к окружающей среде в худшую сторону, чтобы сбросить путь do PATH = $ (getconf PATH)

-121--5602-

OP сформулировал вопрос, чтобы исключить возможность использования команды groups . Поскольку это часть coreutils в Linux, либо (a) он был удален, либо (b) OP ошибается с именем.

OP могла использовать группы , например:

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

Один предложенный ответ только grep 's для имени группы в /etc/group . Иногда это работает так, как предполагалось.

Несколько лучше использование grep учитывает синтаксис /etc/group :

group_name:password:GID:user_list

, так что только часть перед первой двоеточия является допустимым именем группы. Простая группа без учета синтаксиса может (и будет) получать вводящие в заблуждение совпадения из файла. Используйте регулярные выражения, чтобы сделать grep точно совпадающим с тем, что необходимо:

grep -E '^users:' /etc/group |sed -e 's/^.*://'

или используя переменную оболочки:

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

Однако, это только список тех, которые не входят в группу по умолчанию . Чтобы добавить эти , необходимо принять во внимание файл пароля, например, извлекая идентификатор группы из /etc/group и печатая пользователей, чья группа по умолчанию совпадает с /etc/passwd , например,

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' 

Вы можете сделать то же самое, используя только grep и sed, но это больше работы, чем использование awk.

Еще один предложенный ответ, предложенный с помощью getent , который также, вероятно, будет на машине Linux (с Debian, он является частью GNU libc). Однако быстрая проверка показывает, что он предоставляет только содержимое /etc/group .

У меня (как и у большинства) не установлены либузеры или крышка , поэтому я не могу комментировать, удовлетворяет ли он условиям ОП.

Также существует программа id , которая предоставляет информацию о группе. Кто-то может расширить это в качестве возможного ответа.

0
18.04.2018, 14:34
2 ответа
for f in *_200x200*; do
    mv -- "$f" "${f/_200x200/}"
done

или если у вас есть команда perl rename:

rename 's/_200x200//'./*_200x200*
3
28.01.2020, 02:43

Сzsh:

autoload zmv # best in ~/.zshrc
zmv -n '(**/)(*)_200x200(*.png)' '$1$2$3'

(удалить -nкогда счастлив ).

Или для произвольных размеров:

zmv -n '(**/)(*)_<->x<->(*.png)' '$1$2$3'

(обратите внимание, что он удаляет только одно вхождение <width>x<height>для имени файла ).

1
28.01.2020, 02:43

Теги

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