J'ai créé le script suivant qui déplace les fichiers anciens tels que définis du répertoire source vers le répertoire de destination. Cela fonctionne parfaitement.
#!/bin/bash
echo "Enter Your Source Directory"
read soure
echo "Enter Your Destination Directory"
read destination
echo "Enter Days"
read days
find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \;
echo "Files which were $days Days old moved from $soure to $destination"
Ce script déplace très bien les fichiers, il déplace également les fichiers du sous-répertoire source, mais il ne crée pas de sous-répertoire dans le répertoire de destination. Je veux y implémenter cette fonctionnalité supplémentaire.
avec exemple
/home/ketan : source directory
/home/ketan/hex : source subdirectory
/home/maxi : destination directory
Lorsque j'exécute ce script, il déplace également les fichiers hex dans le répertoire maxi, mais j'ai besoin que le même hex soit créé dans le répertoire maxi et y déplace ses fichiers dans le même hex.
la source
for x do
, vous avez un manquant;
là :). De plus, je n'ai aucune idée de ce que vous vouliez réaliser,$0
mais je suis tout à fait convaincu que ce seraitsh
:).for x; do
n'est techniquement pas compatible POSIX (vérifiez la grammaire ), mais les shells modernes permettent à la foisfor x do
etfor x; do
; certains vieux obus Bourne ne bougeaient pasfor x; do
. Sur les coquilles modernes, avecsh -c '…' arg0 arg1 arg2 arg3
,arg0
devient$0
,arg1
devient$1
, etc. Si vous voulez$0
êtresh
, vous devez écriresh -c '…' sh arg1 arg2 arg3
. Encore une fois, certains obus Bourne se sont comportés différemment, mais POSIX le précise.pushd
semble être un meilleur choixcd
, car il est moins intrusif dans l'environnement actuel.Je sais que
find
c'était spécifié, mais cela ressemble à un travail pourrsync
.J'utilise le plus souvent les éléments suivants:
Voici un bon exemple si vous souhaitez déplacer uniquement des fichiers d'un type de fichier particulier ( exemple ):
la source
--remove-source-files
c'était utile, ce qui entraîne le déplacement des fichiers au lieu de leur copie. Ceci est une excellente utilisation de rsync.vous pouvez le faire en utilisant deux instances de find (1)
Il y a toujours cpio (1)
Vérifiez les arguments de cpio. Ceux que j'ai donnés
la source
Ce n'est pas aussi efficace, mais le code est plus facile à lire et à comprendre, à mon avis, si vous copiez simplement les fichiers, puis supprimez ensuite.
Remarque: faille découverte par @MV pour les opérations automatisées:
la source
Vous pouvez le faire en ajoutant le chemin absolu du fichier renvoyé par
find
à votre chemin de destination:la source
$destination
contient des caractères spéciaux, car il subit une expansion dans la coque intérieure. Peut-être que tu voulais diredestination='\'"$destination"\''
? Cela continue encore'
. En outre, cela crée des fichiers tels que/home/maxi/home/ketan/hex/foo
au lieu de/home/maxi/hex/foo
.Mieux (plus rapide et sans consommer d'espace de stockage en faisant une copie au lieu de déplacer), n'est pas non plus affecté par les noms de fichiers s'ils contiennent des caractères spéciaux dans leurs noms:
Ou plus rapidement, en déplaçant un tas de fichiers en même temps pour plusieurs CPU, en utilisant la commande "parallèle":
PS: Vous avez une faute de frappe, "soure" devrait être "source". J'ai gardé le nom de la variable.
la source
C'est moins élégant mais facile si le nombre / taille des fichiers n'est pas trop grand
Compressez vos fichiers dans une
zip
archive, puis décompressez à la destination sans l'-j
option. Par défaut, zip créera la structure de répertoires relative.la source
Essayez de cette façon:
la source
Parce qu'il ne semble pas y avoir de solution vraiment facile à cela et que j'en ai besoin très souvent, j'ai créé cet utilitaire open source pour linux (nécessite python): https://github.com/benapetr/smv
Il existe plusieurs façons de l'utiliser pour obtenir ce dont vous avez besoin, mais le plus simple serait probablement quelque chose comme ceci:
Vous pouvez également l'exécuter en mode sec afin qu'il ne fasse rien d'autre que d'imprimer ce qu'il ferait
Ou dans le cas où cette liste de fichiers est trop longue pour tenir dans la ligne d'argument et que cela ne vous dérange pas d'exécuter python pour chaque fichier, alors
la source