Как использовать read -ra inline?

Мне нужно запустить команду из python, поэтому я делаю:

os.system('IFS=".";for f in data/* ; do read -ra ADDR <<< "$f";     mv "$f" "data/${ADDR[-1]}"; done;')

, но он говорит:

sh: 1: Syntax error: redirection unexpected

Но если я запускаю это в bash, все работает нормально:

IFS="."
for f in data/* 
do 
    read -ra ADDR <<< "$f"
    mv "$f" "data/${ADDR[-1]}"
done;

Работает просто отлично. Как я могу исправить это, чтобы работать в одну строку?

2
задан 4 January 2018 в 21:49

2 ответа

@steeldriver точно определил проблему. Вы можете решить это с помощью:

import subprocess
subprocess.run(['bash', '-c', '''
    IFS="."
    for f in data/*; do
        read -ra ADDR <<< "$f"
        [[ ${#ADDR[@]} -gt 0 ]] && mv "$f" "data/${ADDR[-1]}"
    done
'''])

, но на данный момент вам, вероятно, лучше всего сделать все это в python, а не вызывать bash: что-то вроде

for f in os.scandir("data"):
    if f.is_file():
        addr = f.name.split(".")[-1]
        if f.name != addr:
            os.rename(f.path, "data/"+addr)
5
ответ дан 4 January 2018 в 21:49

После комментария @steeldriver и ответов @glenn jackman:

os.system('/bin/bash -c \'IFS=".";for f in data/* ; do read -ra ADDR <<< "$f";     mv "$f" "data/${ADDR[-1]}"; done; \' ')
1
ответ дан 4 January 2018 в 21:49

Другие вопросы по тегам:

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