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
.