BASH – ignore les fichiers cachés et le répertoire source vide lors de la copie

Je suis nouveau sur BASH, et j’ai travaillé avec ce script avec cron job. J’avais un peu de mal avec ça, à l’origine en utilisant mv , mais il s’avère que ça ne fusionnera pas avec les répertoires correspondants, ou quoi que ce soit. Donc, on m’a conseillé d’utiliser cp , puisque ce serait soi-disant fusionner et remplacer.

/ schedule / = répertoire source / public_html / = répertoire cible

 #!/bin/bash [ignore dot files/hidden files when copying] cp -a schedule/* public_html/ [empty contents of source directory(schedule/) after copying] 

Source: /schedule/ (contenant des dossiers / fichiers)

 /files/ --4.html --5.html /assets/ --sitemap.xml 

Destination: /public_html/ (les dossiers précédents existent déjà)

 /files/ --1.html --2.html --3.html /assets/ --sitemap.xml 

En fin de compte, j’essaie de savoir comment ignorer les fichiers cachés lors de l’utilisation de cp , et de vider le répertoire source après la copie. Je lisais le manuel de référence BASH et voyais nullglob , mais je ne sais pas si c’est ce qui devrait être utilisé.

Quelqu’un pourrait-il donner un exemple ou me diriger dans la bonne direction?

Vous pouvez utiliser la find command suivante pour répertorier tous les fichiers qui ne sont pas masqués et les répertoires qui ne sont pas vides:

 find /schedule -not -path '*/\.*' -not -empty 

Maintenant, pour append cp :

 find /schedule -not -path '*/\.*' -not -empty -exec cp -a '{}' /public_html/ \; 

Avec votre commande cp -a schedule/* public_html/ vous avez déjà accompli la première partie de votre tâche [ignorez les fichiers de points lors de la copie], car l’extension de chemin ignore les noms de fichiers commençant par un ”. l’option n’est pas définie – vous pouvez unset GLOBIGNORE pour vous en assurer.

Pour la deuxième partie [vider le répertoire source après la copie], ajoutez simplement la commande rm :

 cp -a schedule/* public_html && rm -r schedule/* 

ou

 cp -a schedule/* public_html && rm -r schedule/{,.[!.]}* 

(si vous souhaitez que les fichiers de points soient également supprimés).

Vous pouvez utiliser regex pour intercepter tous les fichiers et dossiers cachés et annuler cela avec ! . Vous pouvez ensuite répertorier tous les FILES et copier et supprimer les fichiers.

 FILES=$(find /PATH/TO/SOURCE/FOLDER \( ! -regex '.*/\..*' \) -type f ) for f in $FILES; do cp /PATH/TO/SOURCE/FOLDER/$f /PATH/TO/DEST/FOLDER/$f; rm /PATH/TO/SOURCE/FOLDER/$f done 

Sinon, vous pouvez utiliser mv au lieu de cp et rm .