сложное копирование и переименование файла

В минимальной оболочке POSIX, которая не поддерживает массивы, вы можете просто манипулировать списком позиционных аргументов с помощью команды set. Непосредственно перед циклом forвы можете сделать

if [ -z "$2" ]; then
    set -- --noise "$1" --snr 25 --iterations 1250
else
    set -- --noise "$1" --snr 25 --iterations 1250 --enhancement "$2"
fi

и теперь запустите цикл for как

for snr in 0 5 10 15 20 25; do
    python evaluate.py "$@"
done

Если ваша оболочка поддерживает повторную оболочку массива bash, zshили другую, вы можете просто использовать массив

argv=(--noise "$1" --snr 25 --iterations 1250)

if [ ! -z "$2" ]; then
    argv+=( --enhancement "$2" )
fi

и теперь вызовите скрипт как

python evaluate.py "${argv[@]}"

Как указано в комментариях, вы не используете фактическое значение значения snrиз цикла for. Используйте значение как $snr, где это применимо в аргументах скрипта, и в этом случае вам может понадобиться переместить логику построения списка аргументов внутрь цикла.

-1
29.10.2020, 17:28
3 ответа

Если у вас есть корни имени файла во внешнем файле, вы можете использовать цикл bash для перебора его содержимого:

#!/bin/bash
shopt -s  nullglob

sourcedir=/home/scrivania/pdb_files
targetdir=/home/scrivania/news/

while IFS= read -r froot
do
    for file in "$sourcedir/$froot"*.pdb
    do
        cp "$file" "$targetdir/$froot.pdb"
    done
done < list.txt
  • Это будет перебирать записи в вашем файле, а затем перебирать все файлы, которые начинаются с трех указанных букв и заканчиваются на .pdb. Поскольку вы заявили, что в исходном каталоге есть только один такой файл, этот внутренний цикл forбудет служить для выделения (неизвестного )точного имени файла из шаблона в list.txt. shopt -s nullglobгарантирует, что в (маловероятном )случае такого файла не существует, цикл не наткнется на него.
  • Во «внутреннем» цикле forсценарий копирует файл в целевой каталог. В текущем виде он переименовывает файлы при копировании указанным вами способом. Если это не то, что вы хотите, измените строку на
    cp "$file" "$targetdir"
    
    и сделайте переименование во втором скрипте.
  • Если вы совершенно уверены, что всегда будет ровно один файл, начинающийся с ваших трех букв, вы можете опустить цикл forи заменить его на
    cp "$sourcedir/$froot"*.pdb "$targetdir/$froot.pdb"
    
3
18.03.2021, 22:54
#!/bin/bash
input="files.txt"
while IFS= read -r line
do
 /bin/cp "${line}_A.pdb" "/home/scrivania/news/${line}.pdb"
done 

Должен сделать это.

0
18.03.2021, 22:54
#!/usr/bin/sh

for XXX in $(cat list.txt)
do
  cp /tmp/home/scrivania/pdb_files/${XXX}*.pdb /tmp/home/scrivania/news/$XXX.pdb
done
0
18.03.2021, 22:54

Теги

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