Перебирайте множество папок и выполняйте вычисления с файлами с аналогичным шаблоном в bash.

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

Тестирование

cat ksh_experiment.ksh

#!/usr/bin/ksh
echo "Hello"

Теперь, после предоставления разрешений при запуске файла, результат был успешно выполнен. Теперь, как обсуждалось в здесь , я вставил в свой файл несколько символов возврата каретки. Теперь, когда я запускал скрипт, я получал следующий результат:

ksh: ./ksh_experiment.ksh: not found [No such file or directory]

Теперь cat -v ksh_experiment.ksh тоже выдал тот же результат. Кроме того, если я набирал vim ksh_experiment.ksh , открывался новый файл.

Как обсуждалось в ответе на предоставленную мной ссылку, я удалил символы возврата каретки с помощью команды

 perl -p -i -e "s/\r//g" ksh_experiment.ksh

После исправления ошибок при запуске я получил ожидаемый результат.

0
12.02.2019, 15:20
1 ответ

Этот фрагмент скрипта будет работать с вашими файлами примеров

for file in *.nc
do 
    echo "$file"
done | sed 's/_day_.*//' | sort -u | while read -r pattern
do
    cdo mergetime "${pattern}"* "${pattern}_mergetime.nc"
done

Пояснение:

  • Цикл forс echoпечатает одно имя файла в строке.
  • Команда sedудаляет _day_и все последующие символы.
  • sort -uсортирует частичные имена файлов и удаляет дубликаты.
  • while read -r patternсчитывает по одному шаблону в строке и повторяет шаблоны
  • "${pattern}"*расширяется оболочкой до всех имен файлов, начинающихся с шаблона

Лучше, чем цикл forс echoможет быть

find. -maxdepth 1 -type f -name '*.nc'

Это напечатает все имена файлов, соответствующие *.ncв текущем каталоге без подкаталогов.

Вы можете комбинировать это с циклом по всем подкаталогам, подобным сценарию в вопросе

for dir in /mnt/meteo_a/africa_cordex/historical/0.44/pr/*/     
do 
    dir=${dir%*/}
    echo ${dir##*/} 
    export dir
    pushd $dir
    pwd

    find. -maxdepth 1 -type f -name '*.nc' | sed 's/_day_.*//' | sort -u | while read -r pattern
    do
        cdo mergetime "${pattern}"* "${pattern}_mergetime.nc"
    done

    popd
done

Вместо cdпредлагаю pushdразрешить вернуться с popdпозже.

Вы также можете заменить цикл forпо каталогам дополнительным цикломfind

find /mnt/meteo_a/africa_cordex/historical/0.44/pr -maxdepth 1 -mindepth 1 -type d | while read dir
do
    pushd "$dir"

    find. -maxdepth 1 -type f -name '*.nc' | sed 's/_day_.*//' | sort -u | while read -r pattern
    do
        cdo mergetime "${pattern}"* "${pattern}_mergetime.nc"
    done

    popd
done
1
28.01.2020, 02:41

Теги

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