
У меня есть файлы с одинаковыми именами в 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-парень и не могу заставить это работать даже после поиска циклов. Можно ли это сделать в одну строку довольно легко?
решение1
В вашем подходе есть несколько проблем:
(A B)
может использоваться только для присваивания массива (например,C=(A B)
), но не для его создания «на лету».Однако,дляне требует массива, так что
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
Обратите внимание, что для этого требуются соответствующие папки вСДКуже существовать.
Однако, как уже показал @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
делаетсррекурсивный, т.е. копирует целые каталоги, а не только файлы.
Если вы хотите скопировать только `.афайлы (т.е. есть и другие), то лучше использовать эти команды:
cd build
cp --parents {release,debug}-iphone{os,simulator}/*.a ../sdk
Как это работает:
Снова выполняется расширение скоб, как и прежде.
Переключатель
--parents
делаетсриспользуйте полное имя исходного файла в качестве назначения, т. е. файлы изrelease-iphoneos
будут скопированы в../sdk/release-iphoneos
.
И напоследок небольшой совет:
При экспериментах ссркоманды, всегда используйте -i
переключатель. Это делаетсринтерактивный, то есть он будет запрашивать подтверждение перед перезаписью чего-либо.
решение2
Пытаться:
cp -R build/{release-iphoneos,release-iphonesimulator,debug-iphoneos,debug-iphonesimulator} sdk/