Рейтинг:0

Bash: неправильная функция/использование базового имени команды

флаг ca

В следующей команде я хочу найти определенные файлы и переместить их в другие каталоги, добавив «.log» к имени файла назначения.

find /src/dir/ -type f -mtime +3 -exec mv {} /dst/dir/`basename {}`.log \;

Но это не удается, потому что базовое имя команда, заключенная в обратные кавычки, не работает должным образом. $(базовое имя {}) тоже имеет аналогичный результат.

mv: невозможно переместить /src/dir/foo в /dst/dir//src/dir/foo.log: нет такого файла или каталога

Любая идея будет оценена.

Рейтинг:1
флаг in

Это потому, что оболочка видит `базовое имя {}` или же $(базовое имя {}) прежде чем он обрабатывает аргументы, чтобы найти и обработать их. Напишите скрипт, который делает то, что вы хотите, и запустите его с помощью -exec вместо.

найти... -exec myscript {} \;

куда мой сценарий что-то вроде

#! /бин/ш
mv "$1" /dst/dir/$(базовое имя "$1").log

Вы можете вызывать оболочку для каждого найденного файла, поэтому также возможно следующее:

найти ... -exec bash -c 'mv "$1" "$(базовое имя "$1").log"' -- {} \;

Но протестируйте такое решение должным образом, чтобы убедиться, что цитирование и экранирование работают правильно.

aschkant avatar
флаг ca
Спасибо @choroba за то, что поделились. Поскольку строка является частью самого скрипта, мне интересно, могу ли я просто добавить аргументы в -exec или полностью в одну строку, чтобы работа была выполнена.
флаг in
Вы можете добавлять аргументы, но вы не можете использовать для них синтаксис оболочки — если только вы не попытаетесь написать что-то вроде `-exec bash -c 'mv "$1" "$(basename "$1").log"' -- {} \;`

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.