Ce doit être une question populaire mais je n'ai pas trouvé de réponse.
Comment déplacer tous les fichiers via *, y compris les fichiers cachés, vers le répertoire parent comme ceci:
mv /path/subfolder/* /path/
Cela déplacera tous les fichiers vers le répertoire parent comme prévu mais ne déplacera pas les fichiers cachés. Comment faire ça?
cp -r /path/to/source/. /destination
Réponses:
Vous pouvez trouver un ensemble complet de solutions à ce sujet dans la réponse d'UNIX et Linux à Comment déplacer tous les fichiers (y compris cachés) d'un répertoire à un autre? . Il montre des solutions dans Bash, zsh, ksh93, standard (POSIX) sh, etc.
Vous pouvez utiliser ces deux commandes ensemble:
Ou tous ensemble ( merci pfnuesel ):
Qui s'étend à:
(exemple: se
echo a{.,}b
développe ena.b ab
)Notez que cela affichera quelques avertissements:
Ignorez-les simplement: cela se produit parce que
/path/subfolder/{.,}*
se développe également vers/path/subfolder/.
et/path/subfolder/..
, qui sont le répertoire et le répertoire parent (voir Que signifient «.» Et «..» dans un dossier? ).Si vous souhaitez simplement copier, vous pouvez utiliser un simple:
Cela copiera tous les fichiers, normaux et cachés, car se
/path/subfolder/.
développe en "tout de ce répertoire" (Source: Comment copier avec cp pour inclure les fichiers cachés et les répertoires cachés et leur contenu? )la source
mv /path/subfolder/* /path/subfolder/.* /path/
, pas strictement nécessaire pour combiner les deux commandes en une seule.mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
.
indique le répertoire courant et..
désigne leup
répertoire. Vous devez avoir remarqué que tous les autres fichiers sont déplacés.Je pense que c'est le plus élégant, car il n'essaye pas non plus de bouger
..
:la source
..anything
ou...anything
etc. - stackoverflow.com/a/31438355/2351568 contient le regex correct pour ce problème. || mais de toute façon utilisershopt -s dotglob
reste la meilleure solution!{a,b}*
trouverait tous les fichiers commençant par a ou b tels que «anatomie» et «bulldozer». La deuxième correspondance est juste une correspondance vide, équivalente à*
, et la première correspondance est équivalente à.[!.]
, où le groupe[!.]
signifie un groupe ne commençant PAS par a.
. Cela signifie.*
mais pas..*
.Vous pouvez activer
dotglob
:Pour désactiver
dotglob
, vous devez dire:la source
man shopt
ne fonctionne pas ethelp shopt
est très bref. Mais vous pouvez fairebashman () { man bash | less -p "^ $1 "; }
et ensuitebashman shopt
tout lire à ce sujet directement. (Vous devrez peut-être appuyer sur n pour passer à la commande s'il y a des lignes commençant par shopt, comme je l'ai trouvé.)ls
.. donc pas vraiment ce que vous voudriez, probablementUne autre solution plus simple consiste à utiliser l'
rsync
utilitaire:Remarque: la commande ci-dessus montrera ce qui va être changé. Pour exécuter les modifications réelles, supprimez
--dry-run
.L'avantage est que le dossier d'origine (
subfolder
) serait supprimé ainsi qu'une partie de la commande, et lors de l'utilisationmv
exemples ici, vous devez toujours nettoyer vos dossiers, sans parler de maux de tête supplémentaires pour couvrir les fichiers cachés et non cachés en un seul modèle.en outre
rsync
charge la copie / déplacement de fichiers entre les télécommandes et garantit que les fichiers sont copiés exactement comme ils l'étaient à l'origine (-a
).Le
-u
paramètre utilisé ignorerait les nouveaux fichiers existants,-r
rentrerait dans les répertoires et-v
augmenterait la verbosité.la source
sudo
et--dry-run
, afin que les gens puissent tester les modifications avant d'exécuter la commande réelle afin d'éviter tout désordre potentiel.Laissez-moi vous présenter mon ami "dotglob". Il s'active et se désactive que "*" inclue ou non des fichiers cachés.
Il est réglé par défaut sur "off".
Il est préférable de le réactiver lorsque vous avez terminé, sinon vous risquez de confondre les choses qui supposent qu'il sera éteint.
la source
En utilisant la
find
commande en conjonction avec lamv
commande, vous pouvez empêcher lamv
commande d'essayer de déplacer des répertoires (par exemple..
et.
) et des sous-répertoires. Voici une option:Il y a des problèmes avec certaines des autres réponses fournies. Par exemple, chacun des éléments suivants essaiera de déplacer les sous-répertoires du chemin source:
En outre, 2) comprend le. et .. fichiers et 3) manque des fichiers comme ..foobar, ... barfoo, etc.
Vous pouvez utiliser
mv /source/path/{.[!.],..?,}* /destination/path
,, qui inclurait les fichiers manqués par 3), mais il essaierait toujours de déplacer les sous-répertoires. L'utilisation de lafind
commande avec lamv
commande comme je l'ai décrit ci-dessus élimine tous ces problèmes.la source
Ma solution à ce problème lorsque je dois copier tous les fichiers (y compris les
.
fichiers) dans un répertoire cible en conservant les autorisations est: (écraser s'il existe déjà)yes
est pour écraser automatiquement les fichiers de destination,r
récursifs,v
verbeux,p
conserver les autorisations.Notez que le chemin source ne se termine pas par un
/
(donc tous les fichiers / répertoire et. Fichiers sont copiés)Le répertoire de destination se termine par
/
lorsque nous plaçons le contenu du dossier source vers la destination dans son ensemble.la source
yes
est une commande géniale à utiliser si vous souhaitez remplacer les fichiers de destination, ce n'est pas toujours souhaité. Utilisez-le uniquement si vous êtes sûr de vouloir le faire. De plus, y a-t-il une différence entreyes | cp ...
etcp -f ...
?