5

В солярисе я хотел бы скопировать все файлы, найденные командой find, по несколько другому пути. Следующий скрипт в основном выполняет cp для каждого найденного файла find. Например:

cp ./content/english/activity1_compressed.swf ./content/spanish/activity1_compressed.swf
cp ./content/english/activity2_compressed.swf ./content/spanish/activity2_compressed.swf
...

#!/bin/bash

# Read all file names into an array
FilesArray=($(find "." -name "*_compressed.swf"))

# Get length of an array
FilesIndex=${#FilesArray[@]}

# Copy each file from english to spanish folder
# Ex: cp ./english/activity_compressed.swf ./spanish/activity_compressed.swf
for (( i=0; i<${FilesIndex}; i++ ));
do
    source="${FilesArray[$i]}"

    # Replace "english" with "spanish" in path  
    destination="$(echo "${source}" | sed 's/english/spanish/')"

    cp "${source}" "${destination}"
done

exit 0;

Кажется, это немного, и мне интересно, как использовать sed in-line с командами find и cp для достижения того же самого. Я бы надеялся на что-то вроде следующего, но, видимо, скобки не являются приемлемым методом изменения порядка операций:

find . -name *_compressed -exec cp {} (echo '{}' | sed 's/english/spanish/')

2 ответа2

7

Есть более простые способы, но для переносимости мы можем использовать немного разветвлений и обратных кавычек:

find . -name *_compressed -exec sh -c 'cp {} `echo {} | sed 's/english/spanish/'`' \;
1

Я хотел бы использовать Открывающую кавычку: вы найдете больше на него здесь (кавычка находится в главе 3.4.5).

В основном, когда вы заключаете команду между обратными галочками, сама команда будет подставлена в его вывод.

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