Использование команд Shell для управления путями к файлам для использования в качестве аргументов другой программе

"$(cmd)" форма, рекомендуемая Chris, является самой безопасной, но это легче ввести и будет обычно работать точно также:

$ cd `dirname ~/home/blah/file.zip`

Различие - то, что форма обратных галочек может быть перепутана определенными символами в команде, которую она разворачивает. Для простой команды как та Вы показываете, можно сразу сказать, что это не будет проблемой. Для сценария оболочки, который должен принять произвольные аргументы, более безопасно использовать дважды заключенный в кавычки $() форма.

1
21.11.2018, 23:37
3 ответа

Вот быстрая попытка:

for i in `find -type f -path "./src*" -name "*.php"`; do echo phpunit-skelgen.phar --test -- `echo $i | sed -e 's!./src/!!' | sed -e 's/.php//' | sed -e 's/\\//\\\/g'` $i `echo $i | sed -e 's!./src/!./test/!' | sed -e 's/.php/Test.php/'`;done

Учитывая следующую структуру каталогов:

./src/Superuseradmin/Model/Mapper/MyMapper.php
./src/Superuseradmin/Model/UUID.php

Это должно произвести:

phpunit-skelgen.phar --test -- Superuseradmin\Model\Mapper\MyMapper ./src/Superuseradmin/Model/Mapper/MyMapper.php ./test/Superuseradmin/Model/Mapper/MyMapperTest.php
phpunit-skelgen.phar --test -- Superuseradmin\Model\UUID ./src/Superuseradmin/Model/UUID.php ./test/Superuseradmin/Model/UUIDTest.php

Можно затем сохранить это к сценарию, проверить его и работать. Не упустите пробелы в именах файлов. Они доставят неприятности.

4
27.01.2020, 23:29
  • 1
    , Почему нужно когда-либо использовать конвейер нескольких sed экземпляры сразу друг после друга вместо того, чтобы использовать того sed экземпляр с несколькими -e параметры? Кроме того, одна такая строка является кошмаром понимания. Вычислите значения, присвойте их переменным, командам выполнения с переменными (вместо вычислительных выражений). –  Hauke Laging 31.05.2013, 14:28
  • 2
    Законченное использование изменения этого, спасибо. for i in `find -type f -path "./src*" -name "*.php"`; do mkdir -p `dirname $(echo $i | sed -e 's!./src/\([[:alnum:]]*\)!./test/\1Test!')`; phpunit-skelgen.phar --bootstrap test/Bootstrap.php --test -- `echo $i | sed -e 's!./src/!!' -e 's/.php//' -e 's!\/!\\\\!g'` $i `echo $i | sed -e 's/.php/Test/' -e 's!./src/\([[:alnum:]]*\)!\1Test!' -e 's!\/!\\\\!g'` `echo $i | sed -e 's!./src/\([[:alnum:]]*\)!./test/\1Test!' -e 's/.php/Test.php/'`;done –  Gabriel Baker 31.05.2013, 20:29

Вероятно, Вы хотите сделать что-то вроде этого:

cd src
for i in $(find . -type f -name '*.php'); do
 SRC=$i
 DST="../test/$(dirname $i)/$(basename $i php)Test.php"
 echo "copy $SRC to $DST"
 #cp $SRC $DST
done
-1
27.01.2020, 23:29
  • 1
    for i in ...; SRC=$i вместо for SRC in...? Используя соединение двух переменных с тем же содержанием впоследствии...? –  Hauke Laging 31.05.2013, 14:30
  • 2
    , которому я даю общее представление для иллюстрирования то, что возможно. До Вас для выяснения остальных –   31.05.2013, 14:36
  • 3
    Вы даете общее представление тому, что плохо кодирует. До других для исправления этого. Я сделал это (по крайней мере, указывают на это). Это плохое кодирование не имеет никакого отношения, "что возможно" относительно проблемы быть решенным. –  Hauke Laging 31.05.2013, 14:38
  • 4
    Да, Ваш код является лучшим так или иначе. ;-) –   31.05.2013, 15:17

Вы создаете сценарий оболочки:

#! /bin/bash

find_path="./src/Superuseradmin/Model/Mapper/UUID.php"
# find_path="$1"
class="${find_path#./src/}" # Superuseradmin/Model/Mapper/UUID.php
class="${class%.php}" # Superuseradmin/Model/Mapper/UUID
class="${class//\//\\}" # Superuseradmin\Model\Mapper\UUID
classhead="${class%\\*}" # Superuseradmin\Model\Mapper
classtail="${class#"$classhead"}" # \UUID
class="${classhead}${classtail}" # Superuseradmin\Model\Mapper\UUID
# echo "class: '${class}'"

testfile="./test${find_path#./src}"
testfile="${testfile%.php}Test.php"
# echo "testfile: '${testfile}'"

echo phpunit-skelgen.phar --test -- "$class" "$find_path" "$testfile"

И сделайте find назовите этот сценарий:

find -type f -path "./src*" -name "*.php" -exec /my/script.sh {} \;
0
27.01.2020, 23:29

Теги

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