Mover arquivos específicos de vários diretórios

2

Tenho vários diretórios com milhares de arquivos de vários tipos de arquivos:

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

Qual é a maneira rápida e eficiente de mover de todos os subdiretórios todos os arquivos .txt que possuem 2 ou mais linhas para outro diretório selecionado?

    
por Nightcat 09.01.2015 / 12:37

2 respostas

4

Em um sistema GNU:

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

(note que pode fazer com que os arquivos com o mesmo nome se sobreponham. Uma única invocação do GNU mv irá protegê-lo, mas se xargs invocar vários, isso pode se tornar um problema).

    
por 09.01.2015 / 12:52
1

Algo parecido com o 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 $'
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 $'%pre%' 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
)
' 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 )

Eu o rodei com (), para que ele restaure o diretório atual. Remova o "echo" antes do "mkdir" e "mv", se funcionar como pretendido.

    
por 09.01.2015 / 13:09