Перезапись файлов, найденных find?

Нет никакой причины иметь отдельный пользовательский файл определения. Пользователи системы и реальные пользователи технически не разделяются, но организационно: диапазоном, от которого взяты их UIDs. взгляните на файл /etc/login.defs. Мой openSUSE имеет эти записи:

SYSTEM_UID_MIN            100
SYSTEM_UID_MAX            499
UID_MIN                  1000
UID_MAX                 60000

Инструменты дистрибутива используют эти значения, чтобы сказать этим двум группам независимо. Но если бы Вы создали учетную запись пользователя с UID 300 затем, то его, вероятно, не показали бы в меню входа в систему, но Вы могли использовать ту учетную запись как любой другой.

4
08.05.2015, 08:01
4 ответа

Чтобы сделать его еще более компактным и быстрее, вы можете использовать Parallel :

parallel mv {} {.}t.gif  :::: <(find . -regex '.+[0-9].gif')

Выражение после :::: предоставляет аргументы для параллельно . Эти аргументы затем используются с использованием {} . {.} представляет аргумент без расширения файла. Таким образом, в нашем случае {} будет имена файлов файлов без T в них, например, fig8_4.gif . {.} затем fiT8_4 .

2
27.01.2020, 20:48

Если вы хотите остановиться с Найти и и BaseName , это должно работать:

find . -name "*.gif" ! -name "*t.gif" -execdir sh -c '
  cp -- "$0" "$(basename "$0" .gif)t.gif"' {} \;

Это работает и ресурс - мудрый не самый лучший вариант.

2
27.01.2020, 20:48

Да, это возможно. Один из способов сделать это, может выглядеть так:

cd /den/of/gifs && \
for f in ./*t.gif; do
    mv -- "${f%%t.gif}.gif" "$f"
done

Pattern $ {var %% data} вещь стандартная / posix SH синтаксис для удаления самой длинной строки, которая соответствует Узор С конца $ var .

4
27.01.2020, 20:48

О ваших ошибках:

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'
2
27.01.2020, 20:48

Теги

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