Jak přesunu všechny soubory v adresáři (včetně skrytých) do jiného adresáře?
Pokud mám například složku „Foo“ se soubory „.hidden“ a „notHidden“ uvnitř, jak přesunu oba soubory do adresáře s názvem „Bar“? Následující nefunguje, protože soubor „.hidden“ zůstává v „Foo“.
mv Foo/* Bar/
Zkuste to sami.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
Přijatá odpověď:
Zsh
mv Foo/*(DN) Bar/
nebo
setopt -s glob_dots
mv Foo/*(N) Bar/
(Vynechejte (N)
pokud víte, že adresář není prázdný.)
Bash
shopt -s dotglob nullglob
mv Foo/* Bar/
Ksh93
Pokud víte, že adresář není prázdný:
FIGNORE='.?(.)'
mv Foo/* Bar/
Standardní (POSIX) sh
for x in Foo/* Foo/.[!.]* Foo/..?*; do
if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done
Pokud jste ochotni nechat mv
příkaz vrátí chybový stav, i když byl úspěšný, je to mnohem jednodušší:
mv Foo/* Foo/.[!.]* Foo/..?* Bar/
GNU find a GNU mv
find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +
Standardní hledání
Pokud vám nevadí přejít do zdrojového adresáře:
cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "[email protected]" "$0"' ../Bar/ {} + -type d -prune
Zde je více podrobností o ovládání, zda jsou soubory s tečkami porovnávány v bash, ksh93 a zsh.
Bash
Nastavte dotglob
možnost.
$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero
K dispozici je také flexibilnější GLOBIGNORE
proměnnou, kterou můžete nastavit na seznam vzorů zástupných znaků oddělených dvojtečkou, které chcete ignorovat. Pokud není nastaveno (výchozí nastavení), shell se chová, jako by byla hodnota prázdná, pokud dotglob
je nastaveno a jako by hodnota byla .*
pokud volba není nastavena. Viz Rozšíření názvu souboru v příručce. Všudypřítomné adresáře .
a ..
jsou vždy vynechány, pokud není .
se explicitně shoduje se vzorem.
$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one
Ksh93
Nastavte FIGNORE
variabilní. Pokud není nastaveno (výchozí nastavení), shell se chová, jako kdyby hodnota byla .*
. Chcete-li ignorovat .
a ..
, musí se explicitně shodovat (v příručce ksh 93s+ 2008-01-31 je uvedeno, že .
a ..
jsou vždy ignorovány, ale to správně nepopisuje skutečné chování).
$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero
Soubory teček můžete zahrnout do vzoru tak, že je explicitně spárujete.
$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero
Chcete-li, aby rozšíření bylo prázdné, pokud je adresář prázdný, použijte N
možnost shody vzoru:~(N)@(*|.[^.]*|..?*)
nebo ~(N:*|.[^.]*|..?*)
.
Zsh
Nastavte dot_glob
možnost.
% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero
.
a ..
se nikdy neshodují, i když se vzor shoduje s úvodním .
explicitně.
% echo .*
..two .one
Soubory s tečkami můžete zahrnout do určitého vzoru pomocí D
kvalifikátor glob.
% echo *(D)
..two .one none zero
Přidejte N
kvalifikátor glob, aby rozšíření bylo prázdné v prázdném adresáři:*(DN)
.
Poznámka:Výsledky rozšíření názvu souboru můžete získat v různém pořadí
(např. none
následuje .one
následuje ..two
)
na základě vašeho nastavení LC_COLLATE
, LC_ALL
a LANG
proměnné.