Все можно было сделать на Perl или все в сценарии оболочки. Однако смешивание языков обычно немного запутанно.
Версия сценария оболочки может выглядеть примерно так это (с bash
, например):
#!/bin/bash
dirs=( *.frames )
for dir in "${dirs[@]}"; do
printf 'Working on "%s"\n' "$dir"
cd "$dir"
digitfiles=( RawImage_?.tif )
for file in "${digitfiles[@]}"; do
newfile="RawImage_0${file#RawImage_}"
mv "$file" "$newfile"
done
stackname="../$dir.mrc"
tif2mrc -s *.tif "$stackname"
cd..
done
for f in *.mrc; do
mv -- "$f" "${f%%.*}".mrc
done
Или, немного более идиоматично (теперь с простым sh
, но с использованием find
, который понимает-execdir
):
#!/bin/sh
echo 'Renaming TIFF files'
find *.frames -type f -name 'RawImage_?.tif' \
-execdir sh -c 'mv "$1" "RawImage_0${1#RawImage_}"' sh {} ';'
for d in *.frames; do
printf 'Processing "%s"...\n' "$d"
tif2mrc -s "$d"/*.tif "${d%%.*}.mrc"
done
(оба примера протестированы только в отношении генерации имени файла)
Измените sh -c
на sh -cx
, чтобы получить бит вывода для каждого переименованного файла, или добавьте -print
перед -execdir
.
С помощью -execdir
данная команда оболочки будет выполняться с каталогом найденного файла в качестве рабочего каталога.{}
(и $1
внутри подоболочки )будут базовым именем найденного файла.
Если дляtif2mrc
необходимо запустить внутри каталога файлов TIFF, измените цикл на
for d in *.frames; do
printf 'Processing "%s"...\n' "$d"
(cd "$d" && tif2mrc -s *.tif "../${d%%.*}.mrc" )
done
Обратите внимание, что в Perl использование обратных кавычек для выполнения команды оболочки возвращает вывод этой команды. Вместо этого вы можете использовать
system("tif2mrc -s *.tif $stackname");
, если вас не интересует вывод tif2mrc
.
Кроме того, чтение скрипта или программы, которая меняет каталоги туда и обратно, сбивает с толку. Кроме того, это может привести к нежелательным вещам, если каталог не существует (, chdir("..");
затем поднимет вас на один уровень каталога выше ).
Чтобы правильно это сделать, либо выполните команду со смещенным рабочим каталогом, как в моем последнем примере с оболочкой, либо правильно проверьте код возврата исходного chdir()
в Perl (, это потенциально все равно приведет к коду, который может быть трудно читать и следовать ).
--file-forwarding
If this option is specified, the remaining arguments are scanned, and all arguments that are enclosed between a pair of '@@' arguments are interpreted as file paths, exported in the document store, and passed to the command in the form of the resulting document path. Arguments between '@@u' and '@@' are considered uris, and any file: uris are exported. The exports are non-persistent and with read and write permissions for the application.