Нет никакой причины иметь отдельный пользовательский файл определения. Пользователи системы и реальные пользователи технически не разделяются, но организационно: диапазоном, от которого взяты их UIDs. взгляните на файл /etc/login.defs
. Мой openSUSE имеет эти записи:
SYSTEM_UID_MIN 100
SYSTEM_UID_MAX 499
UID_MIN 1000
UID_MAX 60000
Инструменты дистрибутива используют эти значения, чтобы сказать этим двум группам независимо. Но если бы Вы создали учетную запись пользователя с UID 300 затем, то его, вероятно, не показали бы в меню входа в систему, но Вы могли использовать ту учетную запись как любой другой.
Чтобы сделать его еще более компактным и быстрее, вы можете использовать Parallel
:
parallel mv {} {.}t.gif :::: <(find . -regex '.+[0-9].gif')
Выражение после ::::
предоставляет аргументы для параллельно
. Эти аргументы затем используются с использованием {}
. {.}
представляет аргумент без расширения файла. Таким образом, в нашем случае {}
будет имена файлов файлов без T
в них, например, fig8_4.gif
. {.}
затем fiT8_4
.
Если вы хотите остановиться с Найти
и и
BaseName
, это должно работать:
find . -name "*.gif" ! -name "*t.gif" -execdir sh -c '
cp -- "$0" "$(basename "$0" .gif)t.gif"' {} \;
Это работает и ресурс - мудрый не самый лучший вариант.
Да, это возможно. Один из способов сделать это, может выглядеть так:
cd /den/of/gifs && \
for f in ./*t.gif; do
mv -- "${f%%t.gif}.gif" "$f"
done
Pattern $ {var %% data}
вещь стандартная / posix SH
синтаксис для удаления самой длинной строки, которая соответствует Узор С конца $ var
.
О ваших ошибках:
find: относительный путь `~ / program_files / internet / SSH_tunneling / 'включен в переменную среды PATH, которая является insecure в сочетании с действием find. Удалите эту запись из $ PATH
. У вас есть ~ / program_files / internet / SSH_tunneling /
в вашем $ PATH
. Это буквальный ~
. То есть не означает ваш домашний каталог . Вместо этого это означает относительный путь ~ / program_files / internet / SSH_tunneling /
, то есть SSH_tunneling
внутри internet
внутри program_files
внутри каталога ~
внутри текущего каталога.
-execdir
не любит относительные каталоги в $ PATH
, потому что он помещает chdir ()
в каталоги, из которых запускает команды для выполнения. Например, если при спуске по дереву каталогов, find
находит файл gif
в ./ some-dir
, который также содержит ~
каталог, и там есть ./ some-dir / ~ / program_files / internet / SSH_tunneling / basename
, тогда он может в конечном итоге выполнить это basename
.
У вас, вероятно, есть:
PATH="~/program_files/internet/SSH_tunneling/"
в вашем ~ / .bash *
, который должен был быть:
PATH=~/program_files/internet/SSH_tunneling/
или
PATH="$HOME/program_files/internet/SSH_tunneling"
$ find. -regex ". * t \ .gif" | xargs basename basename: дополнительный операнд ‘./f10_1t.gif’
xargs
запустит basename
с максимально возможным количеством аргументов. basename
ожидает не более 2 аргументов, первый - путь, второй - шаблон. Итак, ваша команда не имеет смысла.
Также xargs
по умолчанию ожидает пробел (пробел,вкладка и, возможно, многое другое в зависимости от вашего языкового стандарта и реализации find
) и новой строки (все из которых могут встречаться в именах файлов), разделенный список на входе со специальной обработкой кавычек, что не является форматом вывода найти
.
find
выведет что-то вроде:
./path/to/picture from "The End of the World".gif
который xargs
будет понимать как 3 разных аргумента: ./ path / to / picture
, from
], Конец света.gif
. find
не имеет режима для вывода в формате, ожидаемом xargs
, здесь:
./path/to/picture\ from\ \"The\ End\ of\ the\ World\".gif
или
'./path/to/picture from "The End of the World".gif'
Некоторые реализации xargs
действительно поддерживают - 0
вариант, хотя для обработки списка с разделителями NUL вместо пробелов / новой строки + кавычки, а некоторые реализации find
имеют предикат -print0
для вывода имен файлов в этом формате (на те, которые этого не делают, вы можете использовать вместо этого -exec printf '% s \ 0' {} +
).
Примерно так:
find . -name "*t.gif" -print0 | xargs -r0 -I {} basename {} t.gif
, что мало пригодится для вашей общей цели. Вместо этого вы, вероятно, захотите что-то вроде:
find . -name '*t.gif' -type f -exec sh -c '
for f do
cp "${f%t.gif}.gif" "$f"
done' sh {} +
Или с помощью zsh
:
autoload zmv # if not already in ~/.zshrc
zmv -C '(**/)(*)t.gif(#qD.)' '$1$2.gif'