Comment copier des fichiers ayant un numéro de ligne> 100 dans un autre dossier

Je souhaite copier des fichiers contenant 100 lignes ou plus vers un autre dossier:

$ cd "/home/john/folder a" $ wc -l * 10 file1.txt 50 file2.txt 100 file3.txt 150 file4.txt 

Je souhaite copier les fichiers file3.txt et file4.txt (fichiers file4.txt 100 lignes ou plus) dans le dossier /home/john/folder b .

Quelqu’un peut-il m’aider s’il vous plaît? Merci beaucoup.

Essaye ça:

 declare -i numfile for f in *; do numfile=$([ -f "$f" ] && cat "$f" | wc -l ) [ $numfile -ge 100 ] && cp "$f" otherdir done 

Pour chaque fichier du répertoire actuel, numfile se voit atsortingbuer le nombre de lignes du fichier.

Si numfile est supérieur ou égal à 100, le fichier est copié sur otherdir .

Modifier :

Comme l’a mentionné William Pursell, une approche plus robuste consisterait à tester si l’élément est un fichier avant d’ exécuter des commandes de comparaison et de copie:

 for f in *; do if [ -f "$f" ]; then [ "$(wc -l < $f)" -ge 100 ] && cp "$f" otherdir; fi done 

En voici un de plus:

 # Assuming that we are in source folder ... cp $(wc -l *|grep -Eo '[0-9]{3,} (.*)'|head -n -1|cut -d ' ' -f 2) /dev/null "/home/john/folder b" 

La head supprime la ligne totale imprimée par wc , et /dev/null prend en charge le fait que vous n’avez aucun fichier correspondant au critère.

Bien sûr, cette solution – comme les autres présentées ici – vous causera des problèmes si votre répertoire source contient autant de fichiers que la longueur maximale de la ligne de commande sera dépassée.

Essayez quelque chose comme ça (POSIX sh):

 #!/bin/sh SOURCE_FOLDER="/home/john/folder a" COPY_TO="/home/john/folder b" for dir in "$SOURCE_FOLDER" "$COPY_TO"; do if [ ! -d "$dir" ]; then echo "Directory ${dir} does not exist." >&2 exit 1 fi done if [ "x`ls -A "$SOURCE_FOLDER"`" = "x" ]; then echo "Directory '${SOURCE_FOLDER}' is empty." >&2 exit 1 fi for file in "$SOURCE_FOLDER"/*; do LINES=`wc -l < "$file"` echo "File ${file} has ${LINES} lines..." if [ "$LINES" -ge 100 ]; then echo "Copying ${file}..." cp -a "$file" "${COPY_TO}/" fi done 

Voici une version Bash pour les systèmes avec Bash (vous avez dit Unix, pas Linux, donc vous voulez probablement la version supérieure):

 #!/bin/bash SOURCE_FOLDER="/home/john/folder a" COPY_TO="/home/john/folder b" for dir in "$SOURCE_FOLDER" "$COPY_TO"; do if [[ ! -d "$dir" ]]; then echo "Directory ${dir} does not exist." >&2 exit 1 fi done if [[ -z "$(ls -A "$SOURCE_FOLDER")" ]]; then echo "Directory '${SOURCE_FOLDER}' is empty." >&2 exit 1 fi for file in "$SOURCE_FOLDER"/*; do LINES="$(wc -l < "$file"')" echo "File ${file} has ${LINES} lines..." if [[ "$LINES" -ge 100 ]]; then echo "Copying ${file}..." cp -a "$file" "${COPY_TO}/" fi done 

Je l'ai testé comme ceci:

 $ mkdir "folder a" $ mkdir "folder b" $ chmod +x script.sh $ cd folder\ a/ $ seq 1 1000 > file1.txt $ seq 1 1000 > file2.txt $ seq 1 100 > file4.txt $ seq 1 100 > file3.txt $ seq 1 99 > file4.txt $ seq 1 1 > file5.txt $ seq 1 20 > file6.txt $ cd .. $ ./script.sh File /.../dev/scratch/stack/folder a/file1.txt has 1000 lines... Copying /.../dev/scratch/stack/folder a/file1.txt... File /.../dev/scratch/stack/folder a/file2.txt has 1000 lines... Copying /.../dev/scratch/stack/folder a/file2.txt... File /.../dev/scratch/stack/folder a/file3.txt has 100 lines... Copying /.../dev/scratch/stack/folder a/file3.txt... File /.../dev/scratch/stack/folder a/file4.txt has 99 lines... File /.../dev/scratch/stack/folder a/file5.txt has 1 lines... File /.../dev/scratch/stack/folder a/file6.txt has 20 lines... 

Je vous encourage à parcourir cette ligne par ligne, en déterminant comment chaque partie du script fonctionne, pour vous aider à effectuer des tâches similaires à l'avenir.

Je vais expliquer quelques choses ici:

  • wc -l < "$file" ne nous donne que le nombre de lignes du fichier, sans le nom de fichier.
  • [ "$LINES" -ge 100 ] est vrai s'il y a au moins 100 lignes dans le fichier.
  • echo "..." >&2 affiche une ligne en erreur standard plutôt qu'une sortie standard.
  • cp -a copie un fichier tout en conservant tous ses atsortingbuts, tels que le propriétaire, les permissions et l'heure de modification.
  • Assurez-vous de citer toutes les variables, à moins que vous n'ayez une bonne raison de ne pas le faire, afin d'éviter les problèmes avec les espaces.