Mover archivos específicos de múltiples directorios

Mover archivos específicos de múltiples directorios

Tengo toneladas de directorios con miles de archivos de varios tipos:

dir
 |__ subdir
 |    |__ file.foo
 |    |__ file.bar
 |    |__ file.txt
 |    |__ (...)
 |__  (...)

¿Cuál es una forma rápida y eficiente de mover desde todos los subdirectorios todos los .txt?archivos que tienen 2 o más líneasa otro directorio seleccionado?

Respuesta1

En un sistema GNU:

find dir -type f -name '*.txt' -exec awk '
    FNR == 2 {printf "%s\0", FILENAME; nextfile}' {} + |
  xargs -r0 mv -t newdir

(tenga en cuenta que puede hacer que los archivos con el mismo nombre se sobrescriban entre sí. Una sola invocación de GNU mvprotegerá contra eso, pero si xargsinvoca varias, entonces podría convertirse en un problema).

Respuesta2

Algo como esto con shell/bash:

move_files_with_line_count()
(
   srcdir="$1"
   destdir="$2"
   suffix="$3"
   minlines="$4"

   cd "$srcdir"
   find . -name "*$suffix" -type f -print0 \
      | while read -r -d $'\0' file; do

         linecnt=$(wc -l "$file" | { read a b; echo $a; }; )

         if [ $linecnt -ge $minlines ]; then

            [ -d "$destdir/${file%/*}" ] \
               || echo mkdir -p "$destdir/${file%/*}"

            echo mv -v "$file" "$destdir/$file"

         fi
   done
)

Lo rodeé con (), para que restaure el directorio actual. Elimine el "echo" antes de "mkdir" y "mv", si funciona según lo previsto.

información relacionada