A maneira mais direta que vejo para fazer isso é com o GNU find
, bash
e o utilitário sponge
de moreutils :
find dir/with/files -name '*.txt' ! -name '*.DontTouch.txt' -print0 |
while IFS= read -rd '' file; do
echo 'cat path/to/theCommonComment.txt "$file" | sponge "$file"'
done
Como está, isso apenas imprimirá os comandos cat
/ sponge
sem realmente fazer nada. Quando tiver certeza de que você tem o que deseja, é possível remover o eco e as aspas simples ao redor do comando.
Sem usar sponge
ou a opção -print0
para encontrar os itens que podem não estar disponíveis em todos os sistemas:
find dir/with/files -name '*.txt' ! -name '*.DontTouch.txt' -exec sh '
for file; do
tempfile=$(mktemp)
cat path/to/theCommonComment.txt "$file" >"$tempfile"
mv "$tempfile" "$file"
done
' sh {} +
Não há uma maneira fácil de parar este simplesmente imprimir o que vai fazer, por isso tenha cuidado. Uma coisa a observar - certifique-se de que seu arquivo theCommonComment.txt
não está no diretório em que você está executando a operação recursiva (ou pelo menos certifique-se de que ele seja excluído da localização), senão você terminará com dois os cabeçalhos em alguns arquivos.
Atualizar
Um último pensamento é que você pode querer verificar se o cabeçalho já foi adicionado ao arquivo. Isso pode ser útil se você adicionar novos arquivos e tiver que executar o comando novamente. Ele também contorna o problema de ter o arquivo theCommonComment.txt
no caminho de pesquisa. As duas soluções se tornariam:
comment_file=path/to/theCommonComment.txt
size=$(wc -c "$comment_file")
find dir/with/files -name '*.txt' ! -name '*.DontTouch.txt' -print0 |
while IFS= read -rd '' file; do
if [ cmp -n "$size" $comment_file" "$file" ]; do
echo 'cat "$comment_file" "$file" | sponge "$file"'
fi
done
export comment_file=path/to/theCommonComment.txt
export size=$(wc -c "$comment_file")
find dir/with/files -name '*.txt' ! -name '*.DontTouch.txt' -exec sh '
for file; do
if [ cmp -n "$size" $comment_file" "$file" ]; do
tempfile=$(mktemp)
cat "$comment_file" "$file" >"$tempfile"
mv "$tempfile" "$file"
fi
done
' sh {} +