Мне нужно запустить команду из 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, это сработает fine:
IFS="."
for f in data/*
do
read -ra ADDR <<< "$f"
mv "$f" "data/${ADDR[-1]}"
done;
Он работает нормально. Как я могу исправить это для работы в одной строке?
@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)
@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)
@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)
После комментария @steeldriver и @glenn jackman ответы:
os.system('/bin/bash -c \'IFS=".";for f in data/* ; do read -ra ADDR <<< "$f"; mv "$f" "data/${ADDR[-1]}"; done; \' ')
После комментария @steeldriver и @glenn jackman ответы:
os.system('/bin/bash -c \'IFS=".";for f in data/* ; do read -ra ADDR <<< "$f"; mv "$f" "data/${ADDR[-1]}"; done; \' ')
После комментария @steeldriver и @glenn jackman ответы:
os.system('/bin/bash -c \'IFS=".";for f in data/* ; do read -ra ADDR <<< "$f"; mv "$f" "data/${ADDR[-1]}"; done; \' ')