GNU/Linux >> Znalost Linux >  >> Linux

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

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é.

Související:Dotaz na seznam serverů pro přidělenou paměť/cpu?
Linux
  1. Přesuňte všechny soubory kromě jednoho

  2. Jak zkopírovat 10 posledních souborů z jednoho adresáře do druhého?

  3. Jak přejmenovat více souborů z jedné přípony na druhou v Linuxu / Unixu?

  1. Jak najít a zkopírovat určitý typ souborů z jednoho adresáře do druhého v Linuxu

  2. Jak přesunout všechny soubory včetně skrytých souborů do nadřazeného adresáře přes *

  3. Jak mohu změnit všechny soubory patřící jednomu uživateli na jiného uživatele?

  1. Jak zkopírovat nastavení z jednoho počítače do druhého?

  2. Jak přesunout soubory z jednoho uživatelského účtu do druhého na stejném počítači?

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