GNU/Linux >> Znalost Linux >  >> Linux

Jak přesunout všechny soubory z aktuálního adresáře do horního adresáře?

Příkaz, který hledáte, je

mv * .[^.]* ..

nebo (další informace viz níže):

(shopt -s dotglob; mv -- * ..)

Vysvětlení:mv příkaz přesouvá soubory a adresáře. Poslední argument pro mv je cíl (v tomto případě adresář o krok "nahoru" ve stromu, .. ). Argumenty před tím jsou zdrojové soubory a adresáře. Hvězdička (* ) je zástupný znak, který odpovídá všem souborům, které nezačínají tečkou. Soubory začínající tečkou (dotfiles) jsou „skryté“. Jsou spárovány pomocí vzoru .[^.]* (viz úprava níže).

Další informace o mv naleznete v manuálové stránce, na kterou jsem odkazoval .

Proč .[^.]* místo .* ?

Jak správně zdůrazňuje Chris Johnsen:vzor .* odpovídá také . a .. . Protože je nechcete (a nemůžete) přesouvat, je lepší použít vzor, ​​který odpovídá jakémukoli souboru začínajícímu tečkou kromě těchto dvou . Vzor .[^.]* dělá právě to:odpovídá jakémukoli souboru (1) začínajícímu tečkou (2) následovaným znakem, který není tečka (3) následovaná nulou nebo více libovolnými znaky.

Jak zdůrazňuje Paggas, museli bychom také přidat vzor .??* za účelem shody souborů začínajících dvěma tečkami. Podívejte se na jeho odpověď na alternativní řešení pomocí find .

Arjanova odpověď zmiňuje shopt abyste se vyhnuli všem těm problémům s dotfiles. Ale pak je tu stále problém se soubory začínajícími pomlčkou. A to vyžaduje tři příkazy. Přesto se mi ta myšlenka líbí. Navrhuji jej použít takto:

(shopt -s dotglob; mv -- * ..)

Tím se spustí shopt v subshell (tedy žádné druhé volání shopt vyžadováno) a používá -- takže soubory začínající pomlčkou nebudou interpretovány jako argumenty mv .


Krátká odpověď:použijte

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

Dlouhá odpověď:

Příkaz

mv * .* ..

nebude fungovat od .* může odpovídat . a .. . Ale příkaz

mv * .[^.]* ..

nebude také fungovat, protože .[^.]* nebude odpovídat, např. ..filename ! Místo toho to, co dělám, je

mv * .[^.] .??* ..

který bude odpovídat všemu kromě . a .. . * bude odpovídat všemu, co nezačíná . , .[^.] bude odpovídat všem 2znakovým názvům souborů začínajícím tečkou kromě .. a .??* bude odpovídat všem názvům souborů začínajícím tečkou s alespoň 3 znaky.

Ještě lépe, můžete použít

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

což zabraňuje ošklivým glob hackům v mv * .[^.] .??* .. !


Jen pro úplnost lze také říci, že prostředí Bash má obsahovat skryté soubory pomocí shopt :

shopt -s dotglob
mv -- * ..
shopt -u dotglob

Linux
  1. Jak používat Wget k rekurzivnímu stahování souborů z webového adresáře?

  2. Jak přesunout všechny soubory (včetně skrytých) z jednoho adresáře do druhého?

  3. Jak přesunout 100 souborů ze složky obsahující tisíce?

  1. Tisknout všechny soubory ve složce?

  2. Jak odstranit všechny soubory s konkrétní příponou v konkrétní složce?

  3. Jak přesunout všechny zdrojové soubory Java do jejich příslušného adresáře balíčku?

  1. Jak použít příkaz 'mv' k přesunutí souborů kromě souborů v konkrétním adresáři?

  2. Jak změnit všechny výskyty slova ve všech souborech v adresáři

  3. Jak zobrazit seznam nedávno smazaných souborů z adresáře?