Переместить определенные файлы из нескольких каталогов

Переместить определенные файлы из нескольких каталогов

У меня есть куча каталогов с тысячами файлов различных типов:

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

Какой быстрый и эффективный способ переместить все подкаталоги .txtфайлы, которые имеют 2 или более строкв другой, выбранный каталог?

решение1

В системе GNU:

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

(обратите внимание, что это может привести к тому, что файлы с одинаковыми именами будут перезаписывать друг друга. Один вызов GNU mvзащитит от этого, но если xargsвызовов будет несколько, это может стать проблемой).

решение2

Что-то вроде этого с 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
)

Я заключил его в (), так что он восстанавливает текущий каталог. Уберите "echo" перед "mkdir" и "mv", если это работает так, как задумано.

Связанный контент