Как получить базовое имя файла в find -exec - PullRequest
1 голос
/ 17 октября 2019

Я сейчас пытаюсь извлечь и использовать имя файла результата команды поиска.

 find /var/log/*/* -iname "*.log" -type f -exec echo $(basename -- {}) \;

Фактический результат:

/var/log/xyz/log1.log
/var/log/xyz/log2.log
/var/log/xyz/log3.log
/var/log/xyz/log4.log

Ожидаемый результат:

log1.log
log2.log
log3.log
log4.log

Есть ли уловка или что-то, что неправильно использует -exec?

Когда я выполняю echo $(basename -- 'path/to/file.txt') в bash, он возвращается правильно file.txt

дальнейшие детали:

Мне нужно использовать полный путь и имя базыв результате:

Моя полная команда выглядит следующим образом:

find /var/log/*/* -iname "*.log" -type f -exec gzip -k -f {} \; -exec gzip -t {}'.gz' \; -exec sh -c "cat {} | grep 'str' > /tmp/$(basename -- {})" \; # and more after

В этой команде я не могу извлечь имя файла и использовать его. он всегда возвращает полный путь к файлу, например /var/log/foo/bar.log

Ответы [ 3 ]

1 голос
/ 17 октября 2019

Не могли бы вы попробовать следующее.

find /your/complete/path -type f -iname "*.log" -printf '%P\n'
1 голос
/ 17 октября 2019

Вам не нужно звонить basename после опции exec. Просто используйте параметр -execdir и напечатайте {} как:

find /var/log/*/ -iname '*.log' -execdir printf '%s\n' {} +

Если вам действительно нужно позвонить basename, используйте его как:

find /var/log/*/ -iname '*.log' -exec basename -- {} \;

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

while IFS= read -rd '' file; do
   echo "$file"
   basename "$file"
   # remaining commands like gzip etc
done < <(find /var/log/*/ -iname '*.log'  -print0)
0 голосов
/ 17 октября 2019

Если вы хотите вызвать basename, используйте его как:

find /var/log/\*/\* -iname "*.log" -type f -exec basename '{}' \;
...