web-dev-qa-db-fra.com

Prenez les n premiers fichiers d'un répertoire commençant par une lettre particulière dans l'ordre alphabétique vers un autre répertoire

Je dois prendre les 3 premiers fichiers d’un répertoire commençant par la lettre b dans l’ordre alphabétique vers un autre répertoire. Je suis venu avec cette commande:

find /users/students/ejackson/A3-ejackson-55688-114906/CS282in \
  -name "b*" | sort | head -3

Et il produit les fichiers appropriés, mais je ne peux rien faire avec eux. Idéalement, je dirigerais simplement la sortie de la commande ci-dessus vers mv, mais je ne pense pas que ce soit possible.

(P.S. je dois le faire sans grep, sed ou awk)

3
Evan

Au lieu d'analyser la sortie find (très mauvaise idée), vous pouvez tirer parti du fait que for effectue une boucle sur les fichiers de manière ordonnée:

i=0; for b in /path/to/files/b*; do (( ++i < 4 )) && echo mv -v -- "$b" /path/to/destination; done

Supprimez echo après le test pour déplacer réellement les fichiers.
Voici les commentaires laids:

# set a variable to 0 so we can increment it
i=0
# glob for the files starting with b
for b in /path/to/files/b*; do 
   # test how many times the loop has been run and if it's less than 4...
   (( ++i < 4 )) && 
     # ... then move the files*  
     echo mv -v -- "$b" /path/to/destination
done

* Cela n'arrivera pas tant que vous ne supprimerez pas echo du début de la ligne. Au lieu de cela, cela indiquera quels fichiers seront déplacés et où (développez les variables pour chaque itération)

Je ne sais pas si cela fonctionne dans tcsh, mais cela fonctionne dans bash, donc pourrait aider d'autres utilisateurs d'Ubuntu qui utilisent principalement bash

1
Zanna

Vous pouvez prendre une liste de fichiers et les traiter via une boucle for dans un script Shell, ou si vous êtes sur la ligne de commande elle-même (le lecteur sera plus difficile à lire)

Consultez cet article à l'adresse nixCraft . n autre tutoriel aussi.

Vous devriez pouvoir faire quelque chose comme

for f in `find /users/students/ejackson/A3-ejackson-55688-114906/CS282in -name "b*" | sort | head -3`
do
    cp $f [target]
done
0
Eric G

Vous avez mentionné que vous utilisez tcsh. La famille des C-Shells n'est pas compatible avec les shell Bourne. Cette commande pourrait fonctionner:

set THREE_FILES=`find …`
cp $THREE_FILES NEW_DIRECTORY

La première commande set crée une nouvelle variable d'environnement appelée THREE_FILES et enregistre le résultat dans cette variable. La cp prend les trois fichiers et les copie dans le NEW_DIRECTORY.

0
qbi