Как запустить такую команду изнутри "find"?

Для постоянно подключенного диска для хранения резервных копий других хостов / var / bacula подойдет; hier (7) говорит, что / var предназначен для «многоцелевого журнала, временных , временных и файлов спула» (выделено мной) . Резервные копии по самой своей природе со временем меняются, что делает / var хорошим выбором. MySQL на некоторых платформах настроен, например, на использование / var в качестве основного хранилища.

В качестве альтернативы, вы можете смонтировать его в / usr / local / bacula , чтобы следовать соглашению FreeBSD о размещении программного обеспечения, установленного из портов, и связанных с ним файлов конфигурации и данных в / usr / local . С другой стороны, мои резервные копии хранятся в новом каталоге верхнего уровня, / data , который также содержит мои общие ресурсы NFS и SMB.

2
03.07.2018, 13:25
3 ответа

Это поведение не воспроизводится с findв FreeBSD 11.1 -RELEASE при использовании /bin/shв качестве оболочки. Я смог воспроизвести его как под /bin/csh, так и под /bin/tcsh.

Чтобы исправить это в cshи tcsh, укажите {}как \{\}или как '{}'или используйте описанный ниже метод.


Чтобы правильно объединить текущий путь с какой-либо другой строкой в ​​реализации find, которая не расширяется должным образом {}при использовании это как часть строки, это можно сделать с дочерней оболочкой.

Пример:

find. -type f -name '*.c' -exec sh -c 'printf "(result):%s\n" "$@"' sh {} +

или с echo(, но см. " Почему printf лучше, чем echo? " ),

find. -type f -name '*.c' -exec sh -c '
    for name do
        echo "(result):$name"
    done' sh {} +

или

find. -type f -name '*.c' -execdir sh -c '
    for name do
        mv -- "$name" "OLD_${name##*/}"
    done' sh {} +

То есть дайте дочерней оболочке(sh -cздесь )пути как команду строковые аргументы, а затем использовать их в порожденной оболочке для конкатенации их, как вы обычно используете переменные оболочки.

(${name##*/}выше предназначено только для защиты от GNU find, который добавляет ./к путям при использовании-execdir)

Связанные:

2
27.01.2020, 22:09

Два последних примера меня смутили. Здесь, если findне заменит {}, то можно предположить, что он оставит его таким, как -, и на выходе будет(result):{}:

# /usr/bin/find. -maxdepth 1 -execdir echo "(result):"{}  \;
(result):

Может быть, это ваша оболочка, которая разрывает эти foo{}строки?

Похоже, tcshу меня есть именно это:

$ tcsh -c 'echo foo{}bar '
foobar
$ tcsh -c 'echo foo {} bar '
foo {} bar

Это было также упомянуто в комментариях к другому вопросу о цитировании {}, GNU находит и маскирует {} для некоторых оболочек -какие? .

Обходной путь :заключенные в кавычки строки, содержащие{}:

$ tcsh -c 'echo "foo{}bar" '
foo{}bar

(Еще одна оболочка, которую необходимо указать для {}, — это fish, но она также отбрасывает одинокую {}.)

0
27.01.2020, 22:09

Возможно, вам лучше использовать что-то вроде:

find. -type f -name 'data*' -print0 | xargs -0 -I % mv '%' 'OLD_%'

с помощью find -print0 | xargs -0, каждое имя файла отделяется нулевым байтом, поэтому пробелы и другие специальные символы в имени файла не приведут к разделению имени файла на два отдельных аргумента.

0
27.01.2020, 22:09

Теги

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