web-dev-qa-db-fra.com

Comment supprimer un répertoire sans supprimer son contenu?

Disons que j'ai un répertoire /home/smit/test. A l'intérieur, j'ai plusieurs sous-répertoires et fichiers. Je souhaite supprimer uniquement le répertoire /home/smit/test et non son contenu interne. Ainsi, les fichiers et sous-répertoires de /home/smit/test seront automatiquement inclus dans /home/smit/?

En outre, dans un cas réel, j'ai le répertoire /usr/share/backgrounds/all/ qui contient de nombreux sous-répertoires. et ces sous-répertoires ont beaucoup d'images. Je souhaite supprimer tous les sous-répertoires afin que leur contenu soit inclus dans /usr/share/backgrounds/all/. Je peux le faire avec une interface graphique, mais je veux le faire de manière cool par terminal. Comment puis-je le faire?

7
noone

Dans ces situations, les fichiers portant le même nom risquent d’être écrasés. Comme mentionné par @Arronical, vous pouvez éviter cela en utilisant l'indicateur -b à mv, ce qui permet de différencier tous les fichiers portant le même nom en ajoutant ~ à leurs noms. Toutefois, si trois fichiers ou plus portent le même nom, seuls le premier et le dernier seront enregistrés. Vérifiez le contenu avant de procéder au déplacement afin de protéger vos fichiers.

Le premier cas simple est facile; nous pouvons utiliser un shell glob. Cependant, cela ne déplacera pas les fichiers cachés, donc si vous avez un nom de fichier commençant par ., commencez par activer dotglob

shopt -s dotglob

Ensuite, vous pouvez exécuter:

mv -b /home/smit/test/* /home/smit
rmdir /home/smit/test

Désactivez dotglob si vous le souhaitez (il reviendra quand même à la valeur par défaut lorsque vous ouvrirez un nouveau shell):

shopt -u dotglob

Pour le deuxième cas (réel), nous utiliserons find, qui déplace les fichiers cachés par défaut:

Assurez-vous que vous êtes au bon endroit en premier.

cd /usr/share/background/all
find -type f -exec echo mv -vb -- {} . \;

Si cela vous convient, exécutez-le sans echo pour déplacer les fichiers.

find -type f -exec mv -vb -- {} . \;

Puis trouver les annuaires

find -type d

Si vous voyez ce que vous voulez supprimer:

find -type d -delete

Ceci est sûr car il refusera de supprimer les répertoires qui ont encore du contenu.

16
Zanna