Mám adresář s více než 1000 soubory. V textovém souboru mám asi 50 názvů souborů, jeden na řádek. Chtěl bych smazat všechny soubory v adresáři, jejichž názvy souborů neodpovídají záznamu v seznamu. Jaký je nejlepší způsob, jak to udělat? Spustil jsem skript Shell, ale nemohl jsem určit správný příkaz, který by měl určit, zda je název souboru na seznamu. Děkuji.
Přijatá odpověď:
Uvědomuji si, že jakoukoli otázku, jak smazat soubory, je třeba brát s velkou opatrností.
Moje první odpověď byla příliš ukvapená, nevzal jsem si na vědomí, že seznam souborů může být pro použití s egrepem poškozen. Upravil jsem odpověď, abych toto riziko snížil.
To by mělo fungovat pro soubory, které nemají v názvu mezeru:
Nejprve znovu vytvořte seznam souborů, abyste se ujistili, že přesně odpovídá názvu souboru:
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
sestavení příkazů rm
cd your_directory
ls | egrep -vf newfilelist | xargs -n 1 echo rm > rmscript
Zkontrolujte, zda vám rm skript vyhovuje (Můžete to udělat pomocí „vim“ nebo „méně“).
Poté proveďte akci:
sh -x rmscript
Pokud mají soubory ve svém názvu mezery (pokud mají soubory "
v názvu to nebude fungovat) :
ls | egrep -vf newfilelist | sed 's,^(.*)$,rm "1",' > rmscript
samozřejmě seznam souborů by neměl být ve stejném adresáři!
UPRAVENO:
Nathanův seznam souborů obsahoval jména, která odpovídala všem souborům v adresáři (např. „html“ odpovídá „bob.html“). Takže nic nebylo smazáno, protože egrep -vf
absorboval veškerý proud. Přidal jsem příkaz k umístění „^“ a „$“ kolem každého názvu souboru. Měl jsem štěstí, že Nathanův seznam souborů byl správný. Pokud by byl formátován pro DOS s řádky ukončenými CR-LF nebo s dalšími mezerami, egrep by nezachoval žádné soubory a všechny by byly smazány.