Как заставить команду cp создавать любые необходимые папки для копирования файла в место назначения [duplicate]

Выражение LAMBDA

(lambda ...) считается лямбда-выражением только в определенных местах, таких как форма function или как глава вызова функции. Лямбда-выражения не оцениваются.

(function              ; special operator FUNCTION
  (lambda () 'foobar)) ; <- this is a lambda expression


(                    ; a function call
 (lambda (foo) foo)  ; <- this is a lambda expression
 'bar                ; argument
)

Но здесь (lambda ...) - макроформа, а не лямбда-выражение:

(funcall             ; calling a function via funcall
 (lambda (foo) foo)  ; this is not a lambda expressions, but the macro lambda
                     ;  as all arguments to FUNCALL it will be
                     ;    macro expanded and evaluated
                     ;  it expands to (function (lambda (foo) foo))
 'bar)               ; argument

Макрос LAMBDA

LAMBDA - макрос. Он расширяет (lambda ...) до (function (lambda ...)), что эквивалентно #'(lambda ...)).

CL-USER > (macroexpand '(lambda (foo) foo))
(FUNCTION (LAMBDA (FOO) FOO))

Макрос сохраняет вам немного записи / чтения, вот и все. В первой версии Common Lisp (CLtL1) макроса LAMBDA не было. Он был добавлен позже и теперь является частью ANSI Common Lisp ,

Специальный оператор FUNCTION

FUNCTION является специальный оператор. Он ожидает имя функции или выражение лямбда . Таким образом, имя или лямбда-выражение не оцениваются. На самом деле лямбда-выражения вообще не могут быть оценены. Внутри FUNCTION выражение лямбда не является макроскопической формой и, следовательно, не будет расширяться снова. Целью FUNCTION является возврат соответствующего объекта функции, который обозначается именем или выражением лямбда . Он возвращает объект функции как значение. С помощью этого специального оператора можно получить доступ к функциональному объекту из глобальных функций и лексических функций.

Оператор FUNCTION необходим в Common Lisp, поскольку он имеет отдельные пространства имен для значений, функций и некоторых других вещей. Это как так называемый Lisp-2 или даже Lisp-n с двумя или несколькими пространствами имен.

Лямбда-выражения в позиции функции в функции form

((lambda (foo) foo) 10) поддерживается встроенным синтаксисом для Common Lisp. См. Лямбда-формы .

Сбивание с толку

Это все логично, но сбивает с толку. Не волнуйтесь, что вы не одиноки, но на практике это не так.

407
задан Mark Amery 13 September 2015 в 21:01
поделиться

2 ответа

Я не знал, что вы можете сделать это с помощью cp.

Вы можете сделать это с помощью mkdir ..

mkdir -p /var/path/to/your/dir

РЕДАКТИРОВАТЬ См. ответ lhunath для включения cp.

104
ответ дан 22 November 2019 в 23:24
поделиться

Такой опции нет. Что вы можете сделать, так это запустить mkdir -p перед копированием файла

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

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"

Теперь просто сохраните его, дайте ему разрешения и запустите с помощью

./cp-improved SOURCE DEST

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

18
ответ дан 22 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

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