У меня есть файлы с одинаковыми именами в 4 подпапках build папок с именем:

  • релиз-iphoneos
  • релиз-iphonesimulator
  • отлаживать-iphoneos
  • отладки iphonesimulator

Я хочу скопировать эти файлы в идентичную структуру каталогов в папке sdk , в командной строке - но не с помощью сценария.

Я думал, что смогу сделать что-то вроде:

for C in (release debug); for T in (iphoneos iphonesimulator); cp build/$C-$T/*.a sdk/$C-$T

Но я не парень по Linux и не могу заставить его работать даже после поиска циклов. Можно ли сделать это достаточно легко в одной строке?

2 ответа2

2

Пытаться:

cp -R build/{release-iphoneos,release-iphonesimulator,debug-iphoneos,debug-iphonesimulator} sdk/
2

Есть несколько проблем с вашим подходом:

  • (A B) можно использовать только для назначения массива (например, C=(A B)), но не для создания одного на лету.

    Однако для for не требуется массив, поэтому for C in A B будет работать просто отлично.

  • Правильный синтаксис for петель for ... in ...; do ..., done .

Эта команда должна работать просто отлично:

for C in release debug; do for T in iphoneos iphonesimulator; do cp build/$C-$T/*.a sdk/$C-$T; done; done

Обратите внимание, что для этого уже нужны соответствующие папки в sdk .

Однако, как уже показал @Robertof, есть способы архивировать это без каких-либо циклов.


Если вы хотите скопировать все файлы из каталогов (т. *.a соответствует всем), вы можете использовать его команду или это небольшое упрощение:

cp -R build/{release,debug}-iphone{os,simulator} sdk

Как это устроено:

  • Оболочка выполнит раскрытие скобки, поэтому команда, которая будет фактически выполнена, будет следующей:

    cp -r build/release-iphoneos build/release-iphonesimulator build/debug-iphoneos build/debug-iphonesimulator sdk
    
  • -r делает cp рекурсивным, то есть он копирует целые каталоги, а не только файлы.


Если вы хотите скопировать только файлы ` .a (т. Е. Есть другие), вам лучше использовать эти команды:

cd build
cp --parents {release,debug}-iphone{os,simulator}/*.a ../sdk

Как это устроено:

  • Опять же, расширение скобок выполняется, как и раньше.

  • Параметр --parents заставляет cp использовать полное имя исходного файла для получателя, то есть файлы из release-iphoneos будут скопированы в ../sdk/release-iphoneos .


Наконец, несколько советов:

При экспериментировании с командами cp всегда используйте ключ -i . Это делает cp интерактивным, что означает, что он будет запрашивать перед перезаписью что-либо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .