0
votes

Comment déplacer tous les fichiers dans un sous-dossier sauf certains fichiers

Je télécharge habituellement avec FileZilla dans le répertoire / Public / Téléchargements sur mon NAS.

J'ai fait un script exécuté par FileZilla lorsque vous téléchargez la file d'attente de télécharger sur < Code> / public / téléchargements / complété . Mon annuaire / public / téléchargements contient également deux fichiers et trois répertoires qui ne doivent pas être déplacés. xxx

J'ai essayé cette commande: xxx

Ceci fonctionne pour les fichiers et dossiers téléchargés nommés sans caractères spéciaux: ils sont déplacés à / public / téléchargements / complété Mais quand il y a un ou un à ou quelque chose d'autre spécial, Xarg se plaint citation unique inégalée; Par défaut, les citations sont spéciales à Xargs, sauf si vous utilisez l'option -0

J'ai recherché une solution par moi-même mais je n'ai pas trouvé quelque chose pour mes besoins alliant trouver, grep et xargs pour les fichiers et répertoires.

Comment dois-je modifier ma commande?


0 commentaires

3 Réponses :


0
votes

J'ai donc changé ma stratégie pour une boucle à l'aide d'un fichier texte temporaire: xxx

1) J'écris une liste de répertoires et de fichiers à déplacer avec "LS" dans "TEMP .txt "

2) Chaque ligne de" TEMP.TXT "est transmise à la variable $ actuelle. Donc, chaque fichier et répertoire sont déplacés un par un avec "MV". La variable $ Courant est double cité dans la commande MV en cas de caractère "espace" au nom du répertoire ou du fichier

3) "Temp.txt" est supprimé


0 commentaires

0
votes

Ceci est juste une suggestion pour votre stratégie de changement forte> em> et pas sur xargs code>. Vous n'avez besoin que de la coque code> shell et mv code> pour l'outil externe.

#!/usr/bin/env bash

shopt -s nullglob extglob

array=( 
  folder.jpg
  log.txt
  Temp
  Cache 
  Completed
)

to_skip=$(IFS='|'; printf '%s' "*@(${array[*]})")

for item in /Public/Downloads/*; do
  [[ $item == $to_skip ]] && continue
  echo mv -v "$item" /Public/Downloads/Completed/ || exit
done
  • Supprimez le echo code> si vous pensez que la sortie est correcte. LI>
  • ajoutez le -x code> E.g. SET -X code> (après l'option shebang) pour voir quel / ce que le code effectue ou bash -x my_script code>, supposant my_script code> est le nom de votre script. li> ul> p>


0 commentaires

0
votes

basé sur l'entrée OP, le problème principal est le nom des fichiers avec des caractères "spéciaux", y compris l'espace. Deux options:

  • Si aucun des fichiers d'entrée n'a embarqué une nouvelle ligne dans le nom de fichier (qui est le cas), le problème peut être traité par une spécification explicite de la chaîne délimitée à la nouvelle ligne (-D '\ n'). Voir ci-dessous
  • Si l'un des fichiers peut contenir une nouvelle ligne dans le nom, l'ensemble du pipeline doit utiliser des chaînes zéro terminées. Ne semble pas être le cas ici. xxx

0 commentaires