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
)
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
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
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
.