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 mv
protegerá contra eso, pero si xargs
invoca 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.