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