Se você tiver o bash 4, considere usar globstar. Isso lhe dá globalização recursiva.
shopt -s globstar
perlz=( **/*.pl ) # */ Hack to fix syntax highlighting
totes="${#perlz[@]}"
i=0
for file in "${perlz[@]}"; do
printf 'Removing first line of Perl files … %d/%d\r' $((++i)) $totes
ed -s "$file" <<< $'1d\nw' # You can use 'sed' if you want to, but ed is an actual file editor
done
echo # print a final newline
Esta solução funciona em arquivos com caracteres malucos em seus nomes e evita um subnível.
Mas se o bash 4 não for uma opção, você poderá recriar essa solução usando find -exec +
:
find . -name '*.pl' -exec bash -c 'totes=$#
i=0
for file; do
printf "Removing first line of Perl files … %d/%d\r" $((++i)) $totes
ed -s "$file" <<< $'\''1d\nw'\'' # Avoid these leaning toothpicks by putting this
# script in a file.
done
echo # print a final newline
' bash {} +
No entanto, isso está sujeito a ARG_MAX do seu sistema (ao contrário do acima), portanto, se o número de arquivos for muito grande, você ainda poderá acabar com várias execuções de subconjuntos dos arquivos.