Ano, můžete snadno vytvořit ls
výstup jednoho souboru na řádek:
ls -a | cat
Vysvětlení:Příkaz ls
zjistí, zda je výstup na terminál nebo do souboru nebo roury, a podle toho se přizpůsobí.
Pokud tedy použijete potrubí ls -a
do pythonu by to mělo fungovat bez jakýchkoliv zvláštních opatření.
můžete použít ls -1
ls -l
také udělá práci
Použijte -1
možnost (všimněte si, že se jedná o „jednu“ číslici, nikoli o malé písmeno „L“), například takto:
ls -1a
Nejprve se však ujistěte, že máte ls
podporuje -1
. GNU coreutils (instalovaný na standardních systémech Linux) a Solaris ano; ale pokud máte pochybnosti, použijte man ls
nebo ls --help
nebo zkontrolujte dokumentaci. Např.:
$ man ls
...
-1 list one file per line. Avoid '\n' with -q or -b
Ls je určen pro lidskou spotřebu a neměli byste analyzovat jeho výstup.
Ve skriptech shellu existuje několik případů, kdy analýza výstupu ls funguje, je nejjednodušší způsob, jak dosáhnout požadovaného efektu. Protože ls může v názvech souborů zkazit jiné než ASCII a řídicí znaky, jsou tyto případy podmnožinou těch, které nevyžadují získání názvu souboru z ls
.
V pythonu není absolutně žádný důvod vyvolávat ls
. Python má všechny ls
vestavěná funkce. Použijte os.listdir
pro výpis obsahu adresáře a os.stat
nebo os
k získání metadat souboru. Další funkce v os
moduly budou pravděpodobně také relevantní pro váš problém.
Pokud přistupujete ke vzdáleným souborům přes ssh, přiměřeně robustní způsob, jak vypsat názvy souborů, je přes sftp:
echo ls -1 | sftp remote-site:dir
To vytiskne jeden název souboru na řádek a na rozdíl od ls
nástroj, sftp
nemanipuluje netisknutelné znaky. Stále nebudete schopni spolehlivě vypsat adresáře, kde název souboru obsahuje nový řádek, ale to se dělá jen zřídka (pamatujte to jako potenciální problém se zabezpečením, nikoli problém s použitelností).
V pythonu (pozor, metaznaky shellu musí být escape v remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Pro složitější interakce vyhledejte dávkový režim sftp v dokumentaci.
Na některých systémech (Linux, Mac OS X, možná některé jiné Uniices, ale rozhodně ne Windows) je jiný přístup připojit vzdálený souborový systém přes ssh s sshfs a pak pracovat lokálně.