У меня есть папка с именем X, в которой много папок и подпапок. Я хочу найти во всех папках внутри X и найти определенный тип документа. Например, xlsx и преобразовать каждый файл в файл xls . В этом случае мне нужно использовать опцию преобразования libreoffice, например libreoffice --headless --convert-to xls
, но здесь есть подвох. После преобразования каждый преобразованный файл должен находиться в той же папке, что и исходный файл xlsx .
Пример:
X/
Folder 1/
Folder 2/
Folder 2.1/file.xlsx
Folder 3/
Folder 4/
Folder 4.1/anotherFile.xlsx
После преобразования:
X/
Folder 1/
Folder 2/
Folder 2.1/file.xls
Folder 2.1/file.xlsx
Folder 3/
Folder 4/
Folder 4.1/anotherFile.xls
Folder 4.1/anotherFile.xlsx
Новые xls * в этом случае будут преобразованы в ту же папку, что и исходная XLSX . Это будет сделано во всех подпапках и для всех найденных xlsx .
Вот сценарий Python, который делает, как Вы описали.
По причинам удобства, чтобы использоваться с другими командами преобразования, я определил filepath+name
и destination
прежде, чем ввести его в команду преобразования. Это также облегчает изменять место назначения на что-то еще, чем текущий каталог файла (если по некоторым причинам Вам, возможно, понадобилось бы это).
примечание: В некоторых случаях (как мой), команда
libreoffice --headless --convert-to xls
только работает при использовании sudo. Если это так, необходимо изменить владение ~/.config
с командой:
sudo chown -R --reference="$HOME" ~/.config
, как описано здесь .
сценарий:
#!/usr/bin/python3
convert_dir = "/path/to/folder/tobeconverted"
import os
import subprocess
for root, dirs, files in os.walk(convert_dir):
for name in files:
if name.endswith(".xlsx"):
# filepath+name
file = root+"/"+name
destination = root
subprocess.Popen(["libreoffice", "--headless", "--convert-to", "xls", file, "--outdir", destination])
else:
pass
Копия это в пустой текстовый файл, замените каталог в вершине файла, сохраните его с .py расширением и выполните его с командой:
python3 /path/to/scrip/script.py
, Но я вполне уверен, Вы знаете это.:)
Это работает на меня:
cd X
find ./ -iname "*.xlsx" > /tmp/out
SAVEIFS=$IFS;
IFS=$(echo -en "\n\b");
while read line ;
do
cd $(dirname $line);
libreoffice --headless --convert-to xls $(basename $line);
echo $PWD;
cd -;
done < /tmp/out;
IFS=$SAVEIFS