linux - renommer - Comment déplacer tous les fichiers, y compris les fichiers cachés, dans le répertoire parent via*




renommer un fichier (5)

Cela déplacera tous les fichiers dans le répertoire parent comme prévu, mais ne déplacera pas les fichiers cachés. Comment faire ça?

Vous pouvez activer dotglob :

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

Afin de désactiver dotglob , vous devez dire:

shopt -u dotglob

Sa doit être une question populaire mais je n'ai pas pu trouver de réponse.

Comment déplacer tous les fichiers via *, y compris les fichiers cachés, dans un répertoire parent comme ceci:

mv /path/subfolder/* /path/

Cela déplacera tous les fichiers dans le répertoire parent comme prévu mais ne déplacera pas les fichiers cachés. Comment faire ça?


En utilisant la commande find en conjonction avec la commande mv , vous pouvez empêcher la commande mv d'essayer de déplacer des répertoires (par exemple .. et . ) Et des sous-répertoires. Voici une option:

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;

Il existe 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:

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/ 
3) mv /source/path/{.[!.],}* /destination/path

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 manquants par 3), mais il essaierait toujours de déplacer les sous-répertoires. L'utilisation de la commande find avec la commande mv telle que décrite ci-dessus, élimine tous ces problèmes.


Laissez-moi vous présenter mon ami "dotglob". Il s'allume et s'éteint si "*" comprend ou non les fichiers cachés.

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c

$ shopt -s dotglob
$ ls *
.den  .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c

La valeur par défaut est "off".

$ shopt dotglob
dotglob         off

Il est préférable de le réactiver lorsque vous avez terminé, sinon vous allez confondre les choses qui présument qu'il sera éteint.


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 la suivante: (écraser si déjà existant)

yes | cp -rvp /source/directory /destination/directory/

yes est pour écraser automatiquement les fichiers de destination, r récursif, v verbose, 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 / car nous plaçons le contenu du dossier source dans l’ensemble de la destination.


Vous trouverez un ensemble complet de solutions à ce sujet dans la réponse UNIX & Linux à Comment déplacer tous les fichiers (y compris les fichiers cachés) d’un répertoire à un autre? . Il montre des solutions en bash, zsh, ksh93, sh standard (POSIX), etc.

Vous pouvez utiliser ces deux commandes ensemble:

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files

Ou tous ensemble ( merci pfnuesel ):

mv /path/subfolder/{.,}* /path/

Qui s'étend à:

mv /path/subfolder/* /path/subfolder/.* /path/

(exemple: echo a{.,}b développe en ab ab )

Notez que ceci affichera quelques avertissements:

mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory

/path/subfolder/{.,}* simplement: cela se produit parce que /path/subfolder/{.,}* s'étend également à /path/subfolder/. et /path/subfolder/.. , qui sont le répertoire et le répertoire parent (voir Que signifient «.» et «..» signifient dans un dossier? ).

Si vous voulez simplement copier, vous pouvez utiliser un simple:

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!

Cela va copier tous les fichiers, normaux et cachés, depuis /path/subfolder/. étend à "tout de ce répertoire" (Source: Comment copier avec cp pour inclure des fichiers cachés et des répertoires cachés et leur contenu? )







command