Я полагаю, что эта ошибка может быть вызвана возвратом каретки здесь . Мне удалось успешно воспроизвести ошибку.
Тестирование
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
После исправления ошибок при запуске я получил ожидаемый результат.
Этот фрагмент скрипта будет работать с вашими файлами примеров
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