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