Comment déplacer tous les fichiers d'un répertoire (y compris ceux qui sont cachés) vers un autre répertoire?
Par exemple, si j'ai un dossier "Foo" avec les fichiers ".hidden" et "notHidden" à l'intérieur, comment puis-je déplacer les deux fichiers dans un répertoire nommé "Bar"? Ce qui suit ne fonctionne pas, car le fichier ".hidden" reste dans "Foo".
mv Foo/* Bar/
Essayez vous-même.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
Réponses:
Zsh
ou
(Oubliez le
(N)
si vous savez que le répertoire n'est pas vide.)Frapper
Ksh93
Si vous savez que le répertoire n'est pas vide:
Standard (POSIX) sh
Si vous êtes prêt à laisser la
mv
commande renvoyer un statut d'erreur même si elle a réussi, c'est beaucoup plus simple:GNU find et GNU mv
Recherche standard
Si cela ne vous dérange pas de passer au répertoire source:
Voici plus de détails sur le contrôle de la correspondance des fichiers .dot dans bash, ksh93 et zsh.
Frapper
Définir l'
dotglob
option .Il existe également la
GLOBIGNORE
variable plus flexible , que vous pouvez définir comme une liste de modèles de caractères génériques séparés par des points-virgules à ignorer. Si non défini (paramètre par défaut), le shell se comporte comme si la valeur était vide sidotglob
est défini et comme si la valeur l'était.*
si l'option est non définie. Voir Extension du nom de fichier dans le manuel. Les répertoires omniprésents.
et..
sont toujours omis, à moins que.
le modèle ne corresponde explicitement au modèle.Ksh93
Définissez la
FIGNORE
variable . Si non défini (paramètre par défaut), le shell se comporte comme si la valeur était.*
. Pour ignorer.
et..
, ils doivent être explicitement mis en correspondance (le manuel de ksh 93s + 2008-01-31 indique cela.
et..
est toujours ignoré, mais cela ne décrit pas correctement le comportement réel).Vous pouvez inclure des fichiers de points dans un modèle en les faisant correspondre explicitement.
Pour que l'extension soit sortie vide si le répertoire est vide, utilisez l'
N
option de correspondance de modèle:~(N)@(*|.[^.]*|..?*)
ou~(N:*|.[^.]*|..?*)
.Zsh
Définir l'
dot_glob
option ..
et..
ne sont jamais appariés, même si le motif correspond.
explicitement au premier .Vous pouvez inclure des fichiers de points dans un modèle spécifique avec le
D
qualificatif glob .Ajouter le
N
qualificatif de glob pour faire l'expansion sortir vide dans un répertoire vide:*(DN)
.Remarque: vous pouvez obtenir des résultats d'extension noms de fichiers dans des ordres différents (par exemple,
none
suivi de.one
suivi..two
) en fonction de vos paramètres desLC_COLLATE
,LC_ALL
et desLANG
variables.la source
nullglob
? Il serait plus logique d'abandonner lamv
commande (comme fish, csh / tcsh, zsh (sans(N)
) do ou bash avec failglob) plutôt que d'exécuter unemv /Bar/
commande sans grand sens..
et..
ne sont jamais égalé (comme dans d' autres coquilles sensibles comme zsh, poissons, pdksh et ses dérivés) , même si vous tournez dotglob dégagez après. (GLOBIGNORE=:; shopt -u dotglob; echo .*
ne sortira pas.
et..
). définir GLOBIGNORE sur.:..
ou.
ou:
avoir le même effet.ksh93
toujours ignorer.
et..
semble avoir été cassé entreksh93k+
(où cela a fonctionné) etksh93m
(où cela ne fonctionne plus). Notez que c’est mauvais en quiksh93
va prendre la valeur de FIGNORE de l’environnement, donc unFIGNORE='!(..)'
env var, par exemple, peut créer des dégâts.De
man bash
la source
mv
plaindre que ce fichier appeléFoo/*
n'existe pas. Fait intéressant, siFoo
est consultable, mais illisible, et qu’un fichier y est appelé*
, vous n’obtiendrez aucune erreur, ce fichier sera déplacé, mais pas les autres dans le répertoire.bash
a unefailglob
option de sorte qu'il se comporte plus commezsh
,fish
oucsh
/tcsh
et annuler la commande avec une erreur lorsqu'un glob ne peut pas être élargi au lieu de ce comportement faux de laisser l'as-est glob.Un moyen simple de le faire
bash
estMais cela va aussi déplacer les répertoires.
Si vous souhaitez déplacer tous les fichiers, y compris les fichiers cachés, mais que vous ne voulez déplacer aucun répertoire, vous pouvez utiliser une boucle for et un test.
for i in $(ls -d {Foo/*,Foo/.*});do test -f $i && mv -v $i Bar/; done;
la source
Une façon est d'utiliser
find
:La
-type f
limite la commande find à la recherche de fichiers. Vous devez enquêter sur la-type
,-maxdepth
, et les-mindepth
options defind
pour personnaliser votre commande pour compte pour les sous - répertoires. Find a une page de manuel longue mais très utile .la source
Foo/
, pas les sous-répertoires et autres fichiers.Essayez la commande de copie
cp
:cp -r
signifie copier récursif, ainsi tous les dossiers et fichiers seront copiés.Vous pouvez utiliser la commande
rm
remove pour supprimer un dossier:Voir plus: déplace tous les fichiers d'un répertoire à un autre .
la source
Rsync est une autre option:
Cela fonctionne car dans rsync la fin de la barre oblique est importante, elle
sourcedirectory/
fait référence au contenu du répertoire, alors qu'ellesourcedirectory
ferait référence au répertoire lui-même.L'inconvénient de cette méthode est que rsync ne nettoie que les fichiers après le déplacement, pas le répertoire. Il ne reste donc qu’un arbre sourcedirectory. Pour des solutions de contournement, voir:
Déplacer des fichiers et supprimer des répertoires avec rsync?
Ainsi, bien que cela ne soit pas optimal pour les opérations de déplacement, cela peut s'avérer extrêmement utile pour les opérations de copie.
la source
Réponse pour bash / poisson
Voici un moyen de le faire en utilisant des caractères génériques:
.[!.]* ..?*
correspondra à tous les fichiers cachés sauf.
et..
.[!.]* ..?* *
correspondra à tous les fichiers (cachés ou non) sauf.
et..
Et pour répondre à l'exemple particulier de cette question, vous avez besoin
cd foo && mv .[!.]* ..?* * ../bar
Explication
.[!.]*
correspond aux noms de fichiers commençant par un point, suivi de tout caractère sauf le point éventuellement suivi d'une chaîne. Ceci est assez proche mais il manque des fichiers commençant par deux points comme..foo
. Pour inclure de tels fichiers, nous ajoutons ceux..?*
qui correspondent aux noms de fichiers commençant par deux points, suivis de tout caractère, éventuellement suivis de toute chaîne.Tester
Vous pouvez tester ces caractères génériques avec les commandes ci-dessous. Je les ai essayées avec succès sous le poisson et bash. Ils échouent sous sh, zsh, xonsh.
la source
Vous pourriez également être en mesure de trouver et de grep avec des citations arrières pour sélectionner les fichiers pour la commande de déplacement. Pass ceux en mv.
Ie pour les fichiers cachés
Alors
Déplace uniquement les fichiers cachés sélectionnés dans
Bar
:Déplace tous les fichiers de Foo à Bar depuis le '.' dans la commande egrep agit comme un caractère générique sans les crochets.
Le
^
personnage veille à ce que la correspondance commence au début de la ligne.Vous trouverez quelques détails sur
egrep
la correspondance des motifs ici .Utilisation des
maxdepth 1
arrêts dans les sous-répertoires.la source
Inspiré de cette réponse :
Sans copier les fichiers ...
Mises en garde:
--link-dest
chemin doit être absolu ou relatif à DESTINATION (Bar
dans l'exemple)Vous devez mettre
/
après SOURCE (Foo/
dans l'exemple), sinon le dossier SOURCE sera copié au lieu de son contenu.la source
Je trouve que cela fonctionne bien pour bash et qu'il n'y a pas besoin de changer les options du shell
MODIFIER:
Donc, comme G-man l’a dit, ma réponse initiale n’est pas conforme à posix et est à peu près identique à la réponse de ndemou ci-dessus avec une modification, qui consiste à utiliser le développement par accolade pour créer des listes de chaînes sur lesquelles une action est ensuite effectuée. Cela signifie simplement que vous n'avez pas besoin d'
cd
entrer dans le répertoire source. Ce n'est pas vraiment un gros changement, mais c'est différent.exemple: disons que vous avez déjà la disposition suivante.
La question initiale ne mentionnait que les fichiers cachés avec une seule période, mais supposons qu'il y en ait avec deux ou plusieurs points au début du nom. Vous pouvez simplement ajouter une expression supplémentaire dans les accolades. Nous pouvons alors exécuter
Cela devient étendu à ce qui suit:
Vous devriez maintenant voir tous les fichiers situés dans le répertoire destdir :
Vous pouvez faire des choses vraiment cool avec des accolades en bash avec encore plus d'ajouts en 4.x. Découvrez bash-hackers pour quelques exemples intéressants.
la source
..
, et (2) pour être compatible POSIX , vous devez utiliser à la!
place de^
; c'est à dire{*,.[!.]*}
.cd
entrer dans le répertoire source pour agir sur les fichiers ou écrire les mêmes chemins d'accès aux fichiers à plusieurs reprises pour exprimer les chemins d'accès à tous les fichiers. Je mettrai à jour l'exemple prochainement pour donner à tous les lecteurs une meilleure idée de ce dont je parle.Pour les distributions Linux minimales, ce qui suit devrait fonctionner. Tout d’abord, effectuez un mouvement de base tout (qui manque les fichiers cachés). Ensuite, déplacez tous les fichiers cachés (y compris le
.
et..
qui ne seront pas réellement déplacés).Remarques: S'il n'y a pas de contenu visible, la première commande produira un message d'erreur. La deuxième commande produira toujours une erreur en disant qu'il ne peut pas bouger
.
et..
. En tant que tel, il suffit de canaliser les erreurs/dev/null
(comme indiqué).Si vous avez besoin de cela comme une ligne, combinez-les simplement avec un point-virgule:
la source