it-swarm-eu.dev

Jak lze smazat všechny soubory s konkrétní příponou v konkrétní složce?

Pokud nastavím aktuální/pracovní adresář (navigace do něj pomocí cd) do nějakého konkrétního adresáře a pak napište:

rm *.xvg

Co udělá tento příkaz? Je pravda, že výše uvedený příkaz pouze smaže soubory s příponou .xvgpouze v pracovním adresáři?

Než jsem se na to zeptal, byl jsem nervózní zkusit to, protože chci mít naprostou jistotu, že výše uvedený příkaz smaže pouze .xvg soubory UMÍSTĚNÉ V PRACOVNÍM ADRESÁŘI .

39
Andrew

Ano, rm *.xvgpouze smaže soubory se zadanou příponou ve vašem aktuálním adresáři.

dobrý způsob, jak se ujistit, že jste skutečně v adresáři, který chcete smazat, je použít příkaz pwd, který zobrazí váš aktuální adresář a poté provést ls k ověření, že najdete soubory, které očekáváte.

Pokud jste trochu znepokojeni vydáním příkazu rm, můžete udělat dvě věci:

  1. zadejte ls *.xvg a zobrazí se seznam souborů, které by byly tímto příkazem ovlivněny.

  2. Pokud nemáte šarže souborů, můžete vždy použít přepínač příkazového řádku -i Pro rm (existuje také pro cp a mv). Pokud použijete rm -i *.xvg, Zobrazí se výzva pro každý jednotlivý soubor, pokud byl v pořádku, abyste jej odstranili, takže si můžete být jisti, že nic, co jste neočekávali, nebylo odstraněno. (Bude to ale únavné, pokud budete mít spoustu souborů :)

37
Levon

Nemusíte navigovat k dir, jen použijte

rm /some/dir/*.xvg 

V případě, že máte na cestě překlep nebo podobnou chybu, kde/som/dir neexistuje:

cd /som/dir
rm *.xvg

omylem smaže všechny soubory .xvg v aktuálním adresáři. První příkaz nebude a nemusíte znovu CD.

Alternativním způsobem by bylo použít najít:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 
21
user unknown

Ano, rm *.xvg smaže pouze soubory končící na .xvg ve vašem aktuálním adresáři. Tady je důvod.

Když napíšete příkaz, jako je tento, práce je rozdělena mezi Shell, který používáte (předpokládejme bash) a příkazový binární.

Binární kód můžete vyhledat zadáním which rm. Tento malý program se stará o odpojení souborů. Programy, jako je tento, lze spustit z příkazového řádku a přečíst seznam argumentů prog arg1 arg2 arg3 při spuštění. V případě rm jsou interpretovány jako seznam plně kvalifikovaných názvů souborů, které mají být odstraněny. Takže pokud jste v adresáři obsahujícím soubor foo.bar, psaní na stroji delete 'foo.*' bude mít za následek rm: foo.*: No such file or directory. Všimněte si jednoduchých uvozovek kolem vzoru souboru, řeknou Shell, aby předal argument Shell tak, jak je.

Pokud však zadáte rm *.bar ve stejném adresáři smaže soubor. Zde se děje to, že vaše prostředí, což je program, který používáte k zadávání příkazů, provádí před transformací argumentů na příkaz nějaké transformace. Jeden z nich se nazývá „rozšíření názvu souboru“, jinak známý jako „globbing“. Můžete vidět seznam rozbalení názvů souborů bash zde . Jedním z nejčastějších rozšíření je *, který je rozbalen na názvy souborů v aktuálním adresáři.

Jednoduchý způsob, jak se dívat na glóby v práci, je použít echo, který vytiskne zpět všechny argumenty předané skrz Shell. Takže zadáním echo * ve stejném adresáři bude výstup foo.bar. Když tedy zadáte rm *.bar, co se vlastně děje, je to, že Shell rozšiřuje seznam argumentů na foo.bar, pak to předá příkazu rm.

Existuje několik způsobů, jak ovládat globbing. Například v nedávných verzích bash můžete zapnout možnost zvanou globstar, která provede rekurzivní expanzi. Psaní na stroji echo **/*.bar zobrazí seznam všech souborů končících na .bar ve všech podsložkách. Takže zadáním rm **/*.bar v globhvě povoleném bash bude skutečně rekurzivně mazat všechny odpovídající soubory v podsložkách.

3
purzelrakete

Příkaz:

  rm ./*.pgm

pracuje pro mě

Příkaz:

rm *.pgm

dává chybový příkaz (v polštině, přeloženo):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

v

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
1
Adam