2013-02-20 1 views
1

В исходной папке есть набор программ, но только последняя версия должна быть скопирована на целевой USB-накопитель.bash: копировать последнюю версию файла из списка масок

Из Bash Script - Copy latest version of a file in a directory recursively, это показывает, что моя формула будет:

f=$(find . -name AdbeRdr\*.exe | sort -n | tail -1) 

Так как сделать работу найти внутри для цикла на множестве масок?

set1="AdbeRdr\*.exe jre-\*.exe LibreOffice\*.msi" 
for m in $set1 
do 
    echo "m: $m" 
    f=$(find . -name $m | sort -n | tail -1) 
    echo "f: $f" 
    cp $f /media/USB 
done 

$m выдает правильные значения (AdbeRdr * .exe и т.д.), $f пуст и cp копирует весь родительский каталог. Если я укажу маску явно без переменной (find . -name AdbeRdr\*.exe | sort -n | tail -1), последний файл будет выводиться правильно.

Куда я иду не так? И как я могу обрабатывать пробелы, если это произойдет в именах файлов?

Спасибо!

ответ

2

Использование массива, а не в строку, чтобы держать ваши элементы, например:

set1=('AdbeRdr*.exe' 'jre-*.exe' 'LibreOffice*.msi') 
for m in "${set1[@]}" 
do 
    echo "m: $m" 
    f=$(find . -name "$m" | sort -n | tail -1) 
    echo "f: $f" 
    cp "$f" /media/USB 
done 

Используйте двойные кавычки вокруг ваших переменных обрабатывать пробелы в именах файлов.

+0

Спасибо, он отлично работает! – user2090692