Простой цикл командной строки в оболочке Linux

Простой цикл командной строки в оболочке Linux

У меня есть файлы с одинаковыми именами в 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/

Связанный контент