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 mv
schützt davor, bei xargs
mehreren 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.