Eu 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 passar de todos os subdiretórios, todos .txtarquivos que possuem 2 ou mais linhaspara outro diretório selecionado?
Responder1
Em um sistema GNU:
find dir -type f -name '*.txt' -exec awk '
FNR == 2 {printf "%s\0", FILENAME; nextfile}' {} + |
xargs -r0 mv -t newdir
(observe que isso pode fazer com que arquivos com o mesmo nome se sobrescrevam. Uma única invocação do GNU mv
protegerá contra isso, mas se xargs
invocar vários, poderá se tornar um problema).
Responder2
Algo assim com 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
)
Coloquei-o entre (), para que ele restaure o diretório atual. Remova o “echo” antes de “mkdir” e “mv”, se funcionar conforme o esperado.