Bestimmte Dateien aus mehreren Verzeichnissen verschieben

Bestimmte Dateien aus mehreren Verzeichnissen verschieben

Ich habe unzählige Verzeichnisse mit Tausenden von Dateien unterschiedlicher Dateitypen:

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

Was ist ein schneller und effizienter Weg, um alle TXT-Dateien aus allen Unterverzeichnissen zu verschieben?Dateien mit 2 oder mehr Zeilenin ein anderes, ausgewähltes Verzeichnis?

Antwort1

Auf einem GNU-System:

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

(Beachten Sie, dass dies dazu führen kann, dass Dateien mit demselben Namen sich gegenseitig überschreiben. Ein einzelner Aufruf von GNU mvschützt davor, bei xargsmehreren Aufrufen kann dies jedoch zu einem Problem werden.)

Antwort2

Mit Shell/Bash etwa so:

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
)

Ich habe es mit () umgeben, damit es das aktuelle Verzeichnis wiederherstellt. Entfernen Sie das "echo" vor "mkdir" und "mv", wenn es wie gewünscht funktioniert.

verwandte Informationen